스크립트 실행과 관련된 파일 참조


95

작성중인 bash 스크립트 source에서 구성 파일에 정의 된 변수를 포함하는 데 사용합니다. 실행할 스크립트는 act.sh이고 스크립트 source는 d act.conf.sh이므로 다음과 act.sh같습니다.

source act.conf.sh

그러나 이것은 작업 디렉토리 아래에있는 파일을 참조하기 act.sh때문에이를 포함하는 디렉토리에서 실행할 때만 작동합니다 act.conf.sh. 호출하지 않고 실행 스크립트와 관련된 파일을 참조하도록 만드는 솔루션이 cd있습니까? 감사.

답변:


118

참조 : BASH FAQ 항목 # 28 : "스크립트의 위치를 ​​어떻게 결정합니까? 같은 위치에서 일부 구성 파일을 읽고 싶습니다."

어떤 솔루션도 100 % 작동하지 않을 것입니다.

일반적으로이 문제에는 해결책이 없다는 것을 인식하는 것이 중요합니다. 들어 보셨을 수있는 접근 방식과 아래에서 자세히 설명 할 접근 방식에는 결함이 있으며 특정 경우에만 작동합니다. 우선, 스크립트 위치에 의존하지 않고 문제를 완전히 피하십시오!

매우 재사용 가능한 도구 를 작성해야하는 경우 올바른 경로를 스크립트의 매개 변수로 사용하는 것이 가장 신뢰할 수있는 방법 입니다.

스크립트가 특정 셸에서만 실행되고 약간의 유연성 만 필요하다고 가정하면이 편집증을 완화 할 수 있습니다. 귀하의 옵션을 살펴 보는 것은 여전히 ​​좋습니다. 특히 문제가되는 사람들이 사용하는 일반적인 패턴이 있습니다.

특히 FAQ에서는 매우 일반적으로 사용되는 $0변수를 피할 것을 권장 합니다.

그 자체가 신뢰할 수 $0없기 때문에 읽는 것은 결코 방탄이 될 $0수 없습니다.

대안으로 $BASH_SOURCE대신 사용할 수 있습니다 . 이 같은:

source "${BASH_SOURCE%/*}/act.conf.sh"

이 솔루션에도 몇 가지주의 사항이 있습니다. 다양한 솔루션 간의 장단점을 보려면 FAQ 페이지를 확인하십시오. 제대로 확장되지 않을 때 편리한 오류 조건이 발생하므로 작동하는 경우 cd와 함께 권장 하는 것 같습니다 $BASH_SOURCE.


1
감사합니다 readlink.. 여기에 .... 그래서 게시 된 질문을 검색 할 키워드를 판단 할 수 없습니다
라이언 리

9
Bash FAQ가 다운되는 경우 관련 정보를 답변에 가져올 수 있습니까?
Merlyn Morgan-Graham

3
Link는 다음을 권장합니다. cd "${BASH_SOURCE%/*}" || exit, 또는 read somevar < "${BASH_SOURCE%/*}/etc/somefile", Link Strongly Discourages $0 "$ 0 자체는 신뢰할 수 없기 때문에 $ 0을 읽는 것은 절대 방탄이 될 수 없습니다."
ThorSummoner 2015 년

10
BASH_SOURCE 이후의 % / *는 무엇을 어떻게 수행합니까?
Silicomancer


34

이것을보십시오 : Bash : 다른 스크립트를 포함하는 방법 _best_?

다음을 사용하는 것이 좋습니다.

source $(dirname $0)/act.conf.sh

8
이것은 당신이 찾는 답이 아닙니다. $0본질적으로 버그가 있습니다. 상단이 투표하는 이유, 또는 단순히 읽기에 대한 허용 대답을 참조하십시오 mywiki.wooledge.org/BashFAQ/028 - 질문에 대한 간단한 해결 방법은 질문하는 것은 같은 것입니다source "${BASH_SOURCE%/*}/act.conf.sh"
Merlyn 모건 - 그레이엄


1

나는 보통 내 스크립트 위에 이것을 추가합니다.

cd $(dirname $BASH_SOURCE)

그런 다음 모든 후속 코드가 해당 스크립트 경로를 기준으로 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.