상황에 대해:
mycommand
이라는 이름의 심볼릭 링크가 있습니다 $PATH
. 다른 곳에서 호출된 파일에 연결됩니다 mycommand.sh
. 이 파일에는 다른 파일이 필요합니다 mycommand2.sh
. 이름을 지정하겠습니다.
somedir
|-mycommand.sh
|-mycommand2.sh
./mycommand.sh
다른 파일을 검색하려면 직접 실행하세요 . 런타임에는 그렇지 않습니다 mycommand
. 이유 : mycommand.sh
../mycommand2.sh
모든 상대 디렉터리를 절대 디렉터리로 변경하지 않고 어떻게 mycommand
작동할 수 있습니까?
답변1
문제는 기호 링크로 인해 발생하지 않습니다.
mycommand.sh
호출 되면 현재 ./mycommand2.sh
작업 디렉토리는 somedir
명령의 이름이 지정되거나 호출되는 방식과 아무 관련이 없습니다. chdir()
시스템 호출이나 cd
셸에 내장된 명령을 통해 설정되는 프로세스 속성입니다 .
이렇게 하면:
cd /path/to/somedir
mycommand
mycommand
AKA는 mycommand.sh
여전히 ./mycommand2.sh
현재 디렉터리에서 찾을 수 있습니다.
mycommand.sh
호출되는 작업 디렉터리에 관계없이 이를 찾으 려면 mycommand2.sh
다음과 같이 수정해야 합니다.
#! /bin/sh -
mydir=$(dirname -- "$0")
"${mydir%/}/mycommand2.sh"
또는 mycommand.sh
작업 디렉토리가 정말로 필요한 경우 somedir
:
#! /bin/sh -
mydir=$(dirname -- "$0")
CDPATH= cd -P -- "$mydir" || exit
./mycommand2.sh
여기서 as를 호출하면 스크립트의 디렉토리 이름이 아닌 기호 링크의 디렉토리 이름이 반환 mycommand
되므로 기호 링크를 사용하면 문제가 발생할 수 있습니다 .dirname -- "$0"
mycommand
mycommand.sh
이 문제를 해결하려면 다음과 같이 수정해야 합니다 mycommand.sh
.
#! /bin/sh -
mydir=$(dirname -- "$(readlink -f -- "$0")")
"${mydir%/}/mycommand2.sh"
여기서 readlink -f
(표준 명령은 아니지만 일반적인) 모든 기호 링크를 해결합니다. 이는 mycommand.sh
그 자체가 다른 디렉토리에 있는 스크립트에 대한 심볼릭 링크가 아니라고 가정합니다.
스크립트를 수정할 수 없거나 수정할 의사가 없는 경우 다른 접근 방식은mycommand
스크립트바꾸다심볼릭 링크이 방법:
#! /bin/sh -
cd /path/to/somedir &&
exec ./mycommand.sh "$@"