심볼릭 링크에서 bash 스크립트를 실행합니다. 상대 디렉토리가 작동하도록 디렉토리를 변경하는 방법

심볼릭 링크에서 bash 스크립트를 실행합니다. 상대 디렉토리가 작동하도록 디렉토리를 변경하는 방법

상황에 대해:

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

mycommandAKA는 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"mycommandmycommand.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 "$@"

관련 정보