심볼릭 링크를 통해 실행될 때 현재 스크립트의 경로 가져 오기


58

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?

답변:


79

이것을 범용 솔루션으로 사용해보십시오.

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

심볼릭 링크를 따르는 경우에는 다음과 같이 할 수도 있습니다.

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

완벽하게 작동하고 내가 시도했던 것보다 훨씬 간단합니다. 감사!
— Mike Deck

@MikeDeck 즐기십시오. 첫 번째 게시 이후 인용 문제가 수정되었습니다. 경로에 공백이나 다른 엉뚱한 문자가있는 경우 최신 편집 옵션을 사용할 수 있습니다. 이 프로젝트에 중요하지 않더라도, 직접 스크립트에서 코드를 복사하여 최상의 옵션을 가질 수 있습니다!
— Caleb

1
두 번째 것은 완벽하게 작동합니다. 첫 번째 해결책은 내 시스템의 심볼릭 링크에서 작동하지 않습니다.
— Mike Deck

4
@ MikeDeck : 첫 번째 솔루션은 경로의 일부로 다양한 디렉토리가 심볼 링크되어있는 일반적인 경우에 효과적이지만 최종 바이너리가 심볼릭 링크이면 도움이되지 않습니다. 그것이 두 번째가 관리하는 것입니다.
— Caleb

1
스크립트 파일이 sourced 인 경우 작동하지 않습니다 (예 $ source ./sript.shDIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
— :)

7

한 줄:

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

2
한 줄 답변은 일반적으로 가장 도움이되지 않습니다. 제안 된 솔루션을 추가로 지원하는 설명, 링크 또는 문서를 포함하도록 답변을 확장하십시오.
— HalosGhost

1
실제로,이 작업을 수행 할 필요는 없습니다. 원본 링크의 readlink 버전은 symlink가 전혀없는 경우에도 정상적으로 작동합니다.
— TheSorcerer

3

readlink -f 나를 위해 작동하지 않습니다, 나는이 실수를했습니다 :

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

그러나 이것은 잘 작동합니다.

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

3
그렇다면 당신은 Mac에 있고 이것은 당신의 질문에 대답해야합니다 .
— Isaac Isaac

예, 저는 MacOs @isaac에 있지만 질문이 없습니다. 나는 내 편에서 작동하는 명령을 게시했습니다.
— Kevin Campion

0

위의 스크립트에 하나의 작은 추가. pwd에 대한 -P 옵션은 심볼릭 링크를 따릅니다.

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

7
심볼릭 링크가 디렉토리 구조의 일부인 경우에만 작동합니다. 파일 자체가 연결되어 있으면 작동하지 않습니다.
— Oliver Gondža
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.