
shebang
line을 사용하여 스크립트를 실행하는 데 사용할 인터프리터를 제공할 수 있습니다.
#!/bin/bash
echo "Hello world"
제 질문은 어떤 인터프리터가 실제로 사용되는지 스크립트에서 어떻게 확인할 수 있느냐는 것입니다. 다음은 작동하지 않습니다.
echo $0
echo $SHELL
답변1
내가 당신을 올바르게 이해했다면 스크립트의 첫 번째 줄에서 셸을 추출하고 싶을 것입니다.
를 사용하면 $SHELL
실제로 사용하고 있는 셸이 표시됩니다. 첫 번째 줄에 지정된 것과 동일할 필요는 없습니다. 예를 들어 .
/ source
명령을 사용하면 현재 실행 중인 셸에서 모든 스크립트를 실행할 수 있습니다.
다음은 첫 번째 줄의 셸을 보여줍니다.
sed -n '1 s/^#!//p' "$0"
다음은 $0
실행 중인 스크립트이며, sed
명령은 선행이 #!
제거된 첫 번째 줄을 인쇄합니다. 해당 줄이 없으면 아무것도 반환되지 않으며 이를 확인할 수 있습니다.
다음과 같이 명령 $(...)
에서 값을 가져올 수 있습니다.sed
echo Script "$0" is running with "$SHELL"
echo It should run with "$(sed -n '1 s/^#!//p' "$0")"
답변2
사용:
echo $(readlink -e /proc/$$/exe)
(즉, 자신의 프로세스에 대한 실행 파일을 확인하십시오).
편집: $SHELL
신뢰할 수 없는 것 같습니다. 이것을 idshell
파일에 넣으세요:
echo I am process $$
echo SHELL is $SHELL
echo /proc/$$/exe is $(readlink -e /proc/$$/exe)
그런 다음 다음의 출력을 비교합니다.
>bash idshell
I am process 24012
SHELL is /bin/bash
/proc/24012/exe is /bin/bash
그리고
>dash idshell
I am process 24062
SHELL is /bin/bash
/proc/24062/exe is /bin/dash
그럼 dash
거짓말인가요??? (그리고 내 우분투에서 sh
해결되었기 때문 입니다 dash
).