모든 디렉토리에서 스크립트를 호출할 수 있도록 $PATH에 추가된 디렉토리에 bash 스크립트 파일이 있습니다.
스크립트와 동일한 디렉터리에 다른 텍스트 파일이 있습니다. 스크립트에서 텍스트 파일을 참조하는 방법이 궁금합니다.
예를 들어 스크립트가 텍스트 파일의 내용만 출력하는 경우 cat textfile
다른 디렉터리에서 스크립트를 호출하면 텍스트 파일을 찾을 수 없기 때문에 작동하지 않습니다.
답변1
경로 확장이나 스크립트 자체에 심볼릭 링크가 없는 한 다음은 동일하게 작동합니다.
MYDIR="$(dirname "$(realpath "$0")")"
MYDIR="$(dirname "$(which "$0")")"
위의 2단계 버전:
MYSELF="$(realpath "$0")"
MYDIR="${MYSELF%/*}"
스크립트에 심볼릭 링크가 있는 경우 which
해당 링크의 해결이 포함되지 않은 답변이 제공됩니다. realpath
시스템에 기본적으로 설치되어 있지 않은 경우여기에서 찾을 수 있습니다..
[편집하다]:realpath
딱히 메리트가 없을 것 같으 니까readlink -f
케일럽이 제안하다, 후자를 사용하는 것이 더 나을 수도 있습니다. 내 타이밍 테스트에서는 실제로 더 빠른 것으로 나타났습니다.
답변2
realpath
내 시스템에는 없습니다rozcietrzewiacz가 제안한 것.
명령을 사용하여 이 작업을 수행할 수 있습니다 readlink
. 구문 분석이나 다른 솔루션에 비해 이 솔루션을 사용하면 which
실행된 경로나 파일 이름의 일부가 심볼릭 링크인 경우에도 실제 파일이 있는 디렉터리를 찾을 수 있다는 이점이 있습니다.
MYDIR="$(dirname "$(readlink -f "$0")")"
그러면 텍스트 파일을 다음과 같은 변수로 읽을 수 있습니다.
TEXTFILE="$(<$MYDIR/textfile)"
답변3
$0
스크립트에 있는 내용은 스크립트의 전체 경로가 되며 dirname
전체 경로를 사용하고 디렉터리만 제공하므로 cat 텍스트 파일에 다음을 수행할 수 있습니다.
$ cat "$(dirname -- "$0")/textfile"
답변4
나는 이것을 시도하고 있지만 realpath는 나에게 작동하지 않습니다. 내가 채택한 솔루션은 다음과 같습니다.
SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
지금까지 잘 작동했습니다. 이 접근 방식에 잠재적인 문제가 있는지 궁금합니다.