shebang
스크립트를 실행하는 데 사용할 인터프리터를 제공하기 위해 행을 사용할 수 있습니다 .
#!/bin/bash
echo "Hello world"
내 질문은 어떤 인터프리터가 실제로 사용되는지 스크립트에서 어떻게 결정할 수 있는지입니다. 다음은 작동하지 않습니다.
echo $0
echo $SHELL
답변
내가 당신을 올바르게 이해한다면, 당신은 스크립트의 첫 줄에서 쉘을 추출하고 싶습니다.
사용할 때 $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")"
답변
용도:
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
).