"echo ${BASH_SOURCE[0]}"이 포함된 스크립트를 가져오면 여전히 소스 스크립트의 경로 이름이 표시됩니다.

"echo ${BASH_SOURCE[0]}"이 포함된 스크립트를 가져오면 여전히 소스 스크립트의 경로 이름이 표시됩니다.

스크립트 자체의 경로 이름을 출력하는 bash 스크립트가 있습니다.

$ cat f4.sh 
#! /bin/bash    
echo "${BASH_SOURCE[0]}"

다른 스크립트 안에 스크립트를 가져와서 다른 스크립트를 실행하면 다른 스크립트의 경로 이름이 출력될 것이라고 생각했습니다. 가져오기는 get 스크립트의 내용을 get 스크립트에 복사하고 get 스크립트를 실행하는 것과 같기 때문입니다.

하지만 내가 틀렸어요. 여전히 원래 스크립트의 경로 이름을 출력합니다.

$ cat ff.sh 
#! /bin/bash
source ../f4.sh

$ bash ff.sh 
../f4.sh

왜?

다른 스크립트에서 경로 이름을 직접 출력하는 대신 f4.sh를 사용할 수 있는지 궁금합니다 ${BASH_SOURCE[0]}. 감사해요.

답변1

이 경우 에서 메인 스크립트의 경로명을 얻으려면 BASH_SOURCE를 사용해야 합니다 ${BASH_SOURCE[1]}.

각 조달 수준에 대해 새로운 요소가 추가됩니다.시작array BASH_SOURCE이므로 ${BASH_SOURCE[0]}항상 현재 소스 파일과 ${BASH_SOURCE[1]}해당 소스 파일(및 ${BASH_SOURCE[2]}해당 소스 파일) 입니다.그것소스인 경우 소스). 기본 스크립트를 이해하려면 ${BASH_SOURCE[-1]}마지막 요소를 살펴보세요.

스크립트를 가져오더라도 스크립트 내용이 기본 스크립트에 정확히 복사되지는 않습니다. 이것은좋다일반 스크립트를 실행하지만 기본 스크립트와 동일한 환경에서 실행됩니다. 함수를 실행하는 것과 더 비슷합니다.

관련 정보