Shebang, 통역사 및 대본 사용할 수 있습니다 . #!/bin/bash echo “Hello world” 내 질문은

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).