Shebang, 통역사 및 스크립트

Shebang, 통역사 및 스크립트

shebangline을 사용하여 스크립트를 실행하는 데 사용할 인터프리터를 제공할 수 있습니다.

#!/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).

관련 정보