파일 실행이 어떻게 시작되는지 알 수 있는 방법이 있는지 궁금합니다.
예를 들어 다음 파일을 고려해보세요.
~/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.sh
및 b.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
보시다시피, source
d 파일에서 호출자는 "${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