나는 다음과 같은 상황에 처해 있습니다.
내 모든 소프트웨어는 해당 /home/daniel/*
경로에 설치되어 내부적으로 참조됩니다. 그러나 네트워크 드라이브를 사용하면 참조가 로 변경되어 /home/foo/daniel
더 이상 소프트웨어를 사용할 수 없습니다.
예를 들어 일부 프로그램을 호출하거나 일부 환경 변수를 변경하여 go 경로를 변경하는 방법이 있습니까? 아니면 두 개의 프로그램이 있어야 합니까?
답변1
소프트웨어가 어떻게 작동하는지에 따라 다릅니다.추천내부 경로로.
환경 변수를 통해서만 수행할 수 있는 경우 다음을 수행할 수 있습니다.
eval "$(export -p | sed 's|/home/daniel|/home/foo/daniel|g')"
모든 /home/daniel
s를 /home/foo/daniel
해당 값으로 변경하십시오.
추가 /home/foo/daniel/lib
(또는 공유 라이브러리가 설치된 위치)는 $LD_LIBRARY_PATH
프로그램에서 해당 라이브러리를 찾는 데 도움이 됩니다. 그러나 일부 소프트웨어가 conf 파일을 찾 /home/daniel/etc
거나 에서 특정 데이터 파일을 찾도록 하드 코딩된 경우 /home/daniel/share
이를 재정의하도록 설정할 수 있는 동등한 표준 환경 변수가 없습니다.
문제를 해결하기 위해 /home/daniel
-> 심볼릭 링크를 추가하거나 chroot 또는 사용자 설치 네임스페이스를 생성할 수 없는 경우 예를 들어 소프트웨어를 다시 컴파일하는 것이 좋습니다 . 그러면 원하는 위치에 언제든지 심볼릭 링크를 사용할 수 있습니다.../foo/daniel
--prefix=/var/tmp/daniel
답변2
나는 당신이 쉘 스크립트에 대해 이야기하고 있다고 가정합니다. 스크립트 이름을 사용할 수 있다는 사실을 활용해 보세요 $0
. 불행하게도 이것은 ./myprog
도움이 되지 않는 것처럼 보일 수 있으므로 realpath
전체 경로 이름을 얻으려면 (또는 이에 상응하는)를 사용하십시오.
귀하의 질문에서 알 수 있듯이 이것은 항상 작동해야 합니다. 하지만 충분하지 않은 경우 $PWD
대체용으로 사용해 보세요. 다음 코드는 작업을 "해야" 합니다.
getdir()
{
case "$1" in
(*/daniel/*)
my_dir=$(printf '%s\n' "$1" | sed 's|/daniel/.*|/daniel|'
return 0
(*)
return 1
esac
}
getdir $(realpath "$0") || getdir "$PWD" || { echo "I dunno."; exit 1; }
따라서 스크립트가 현재 다음과 같이 말한다면
date >> /home/daniel/log
당신은 그것을로 바꿀 것입니다
date >> "$my_dir"/log
방금 우연히 발견했어요스크립트 자체에서 Bash 스크립트의 소스 디렉터리를 어떻게 얻나요?, 72개의 답변이 있으며 그 중 일부는 위 답변의 변형입니다.