나는 여러 컴퓨터에 배포될 지원 파일과 일부 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)"