상황에 대해 :
mycommand
내에서 명명 된 심볼릭 링크가 있습니다 $PATH
. mycommand.sh
다른 곳에서 호출되는 파일에 링크됩니다 . 그 파일은 다른 파일이 필요합니다 mycommand2.sh
.
somedir
|-mycommand.sh
|-mycommand2.sh
직접 실행 ./mycommand.sh
하면 다른 파일이 발견됩니다. 실행할 때 mycommand
그렇지 않습니다. 이유 : mycommand.sh
다른 파일 내 에서 ./mycommand2.sh
.
mycommand
모든 상대 디렉토리를 절대 디렉토리로 변경하지 않고 어떻게 작업 할 수 있습니까?
문제는 심볼릭 링크로 인한 것이 아닙니다.
mycommand.sh
호출 ./mycommand2.sh
할 경우 현재 작업 디렉토리는 다음과 같습니다 somedir
. 현재 작업 디렉토리는 명령의 이름이 지정되거나 호출 된 방법과 관련이 없습니다. chdir()
시스템 호출 또는 cd
쉘 의 내장 명령으로 설정되는 프로세스의 속성입니다 .
그랬다면 :
cd /path/to/somedir
mycommand
mycommand
일명 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
그리고는 다음과 같이 호출처럼 심볼릭 링크를 사용하여 문제를 야기 할 때의 mycommand
, dirname -- "$0"
의이 dirname을 반환 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 "$@"
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다