심볼릭 링크를 통해 실행할 때 현재 스크립트의 경로를 가져옵니다.

심볼릭 링크를 통해 실행할 때 현재 스크립트의 경로를 가져옵니다.

나는 여러 컴퓨터에 배포될 지원 파일과 일부 bash 스크립트를 포함하는 여러 디렉터리로 구성된 유틸리티를 가지고 있습니다. 각 컴퓨터의 다른 디렉터리에 있을 수도 있습니다. 스크립트는 자신과 관련된 경로를 참조할 수 있어야 하므로 현재 실행 중인 파일의 경로를 가져올 수 있어야 합니다.

나는 dirname $0내 스크립트가 직접 호출될 때 이 관용구가 완벽하게 작동한다는 것을 알고 있습니다. 불행하게도 사람들은 완전히 다른 디렉터리에서 이러한 스크립트에 대한 심볼릭 링크를 생성하고 여전히 상대 경로 논리가 작동할 수 있기를 원합니다.

전체 디렉터리 구조의 예는 다음과 같습니다.

/
 |-usr/local/lib
 |  |-foo
 |  |  |-bin
 |  |  |  |-script.sh
 |  |  |-res
 |  |  |  |-resource_file.txt
 |-home/mike/bin
 |  |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)

/usr/local/lib/foo/res/resource_file.txt또는 에 의해 호출되는지 여부를 안정적으로 참조하는 방법은 무엇입니까 script.sh?/usr/local/lib/foo/bin/script.sh~mike/bin/link_to_script

답변1

일반적인 해결 방법으로 다음을 시도해 보세요.

DIR="$(cd "$(dirname "$0")" && pwd)"

특정 심볼릭 링크의 경우에도 이 작업을 수행할 수 있습니다.

DIR="$(dirname "$(readlink -f "$0")")"

답변2

한 줄:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))

답변3

readlink -f저에게는 작동하지 않습니다. 다음 오류가 발생합니다.

readlink: illegal option -- f
usage: readlink [-n] [file ...]

하지만 이것은 잘 작동합니다.

DIR="$(dirname "$(readlink "$0")")"
echo $DIR

답변4

위 스크립트에 약간의 추가 사항이 있습니다. pwd에 대한 -P 옵션은 기호 링크를 따릅니다.

DIR="$(cd "$(dirname "$0")" && pwd -P)"

관련 정보