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


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.