유닉스에서 스크립트 개시자를 찾는 방법

유닉스에서 스크립트 개시자를 찾는 방법

파일 실행이 어떻게 시작되는지 알 수 있는 방법이 있는지 궁금합니다.

예를 들어 다음 파일을 고려해보세요.

~/foo.sh

echo "Hello from foo.sh"
# print the name of the initiator/parent of this execution 

~/bar.sh

source ~/foo.sh

~/baz.sh

. ~/foo.sh

내가 실행할 때

sh ~/bar.sh또는 인쇄해야 합니다 .~/bar.sh.~/foo.sh~/bar.sh

sh ~/baz.sh또는 인쇄해야 합니다 .~/baz.sh.~/foo.sh~/baz.sh


bash나는 일반적으로 말하려고 노력하고 있지만 또는 에 특정할 수도 있습니다 zsh.

답변1

해결책 은 다음과 같습니다 bash( #!/bin/bash첫 번째 줄 또는 로 실행되는 스크립트 의 경우 bash script...).

설정 예(스크립트 2개 a.shb.sh):

cat >a.sh <<'x' && chmod a+x a.sh
#!/bin/bash
echo This is a.sh
source b.sh
echo End a.sh
x

cat >b.sh <<'x' && chmod a+x b.sh
#!/bin/bash
echo This is b.sh
echo "BASH_SOURCE=(${BASH_SOURCE[@]}) and we are '${BASH_SOURCE[0]}' called by '${BASH_SOURCE[1]}'"
echo End b.sh
x

이제 코드를 실행하고 출력을 확인하세요.

./a.sh
This is a.sh
This is b.sh
BASH_SOURCE=(b.sh ./a.sh) and we are 'b.sh' called by './a.sh'
End b.sh
End a.sh

보시다시피, sourced 파일에서 호출자는 "${BASH_SOURCE[1]}".

답변2

그냥 껍질을 가지고 있습니다 bash. source해당 파일에 대한 매개변수가 제공될 수 있습니다.

이는 foo.sh를 다음과 같이 구성할 수 있음을 의미합니다.

#!/bin/bash
echo "Hello from $1"

그리고 bar.sh는

#!/bin/bash
source ~/Codes/tests/foo.sh '~/bar.sh'

마지막으로 baz.sh는 다음과 같습니다.

#!/bin/bash
source ~/Codes/tests/foo.sh '~/baz.sh'

당신이 신경 쓴다면어떻게스크립트가 호출되면 foo.sh를 다음과 같이 작성할 수도 있습니다.

#!/bin/bash
echo "Hello from $0"

그리고 bar.sh는

#!/bin/bash
source ~/Codes/tests/foo.sh

Hello from ./bar.sh이는 스크립트 디렉터리에서 호출하면 제공됩니다. 집에서 전화하면 받을 수 있어요.Hello from ~/bar.sh

관련 정보