이 솔루션은 tcsh가 아닌 bash에만 적용됩니다. ${BASH_SOURCE[0]}
함수 내에서 경로를 찾으 려면 일반적으로 제공되는 답변 이 작동하지 않습니다.
파일이 소스인지 스크립트로 실행되는지에 관계 없이이 줄이 항상 작동하는 것으로 나타났습니다.
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
readlink
위의 경로에서 심볼릭 링크를 사용하려면 재귀 적으로 또는 비재 귀적으로 사용하십시오.
다음은 시도해보고 다른 제안 된 솔루션과 비교하는 스크립트입니다. source test1/test2/test_script.sh
또는 로 호출하십시오 bash test1/test2/test_script.sh
.
#
# Location: test1/test2/test_script.sh
#
echo $0
echo $_
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
cur_file="${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}"
cur_dir="$(dirname "${cur_file}")"
source "${cur_dir}/func_def.sh"
function test_within_func_inside {
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}
echo "Testing within function inside"
test_within_func_inside
echo "Testing within function outside"
test_within_func_outside
#
# Location: test1/test2/func_def.sh
#
function test_within_func_outside {
echo ${BASH_SOURCE}
echo ${BASH_SOURCE[${#BASH_SOURCE[@]} - 1]}
}
one-liner가 작동하는 이유는 BASH_SOURCE
환경 변수와 관련 변수를 사용하여 설명합니다 FUNCNAME
.
BASH_SOURCE
멤버가 FUNCNAME 배열 변수의 해당 쉘 함수 이름이 정의 된 소스 파일 이름 인 배열 변수입니다. 쉘 함수 $ {FUNCNAME [$ i]}은 $ {BASH_SOURCE [$ i]} 파일에 정의되어 있으며 $ {BASH_SOURCE [$ i + 1]}에서 호출되었습니다.
기능 명
현재 실행 호출 스택에있는 모든 쉘 함수의 이름을 포함하는 배열 변수입니다. 인덱스가 0 인 요소는 현재 실행중인 쉘 함수의 이름입니다. 맨 아래 요소 (인덱스가 가장 높은 요소)는 "main"입니다. 이 변수는 쉘 기능이 실행될 때만 존재합니다. FUNCNAME에 대한 지정은 적용되지 않으며 오류 상태를 리턴합니다. FUNCNAME을 설정하지 않으면 나중에 다시 설정하더라도 특수 속성이 손실됩니다.
이 변수는 BASH_LINENO 및 BASH_SOURCE와 함께 사용할 수 있습니다. FUNCNAME의 각 요소에는 호출 스택을 설명하기 위해 BASH_LINENO 및 BASH_SOURCE에 해당 요소가 있습니다. 예를 들어 $ {FUNCNAME [$ i]}은 (는) 행 번호 $ {BASH_LINENO [$ i]}의 $ {BASH_SOURCE [$ i + 1]} 파일에서 호출되었습니다. 발신자 기본 제공은이 정보를 사용하여 현재 호출 스택을 표시합니다.
[출처 : 배쉬 매뉴얼]