Shebang, 통역사 및 대본


0

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

#!/bin/bash
echo "Hello world"

내 질문은 어떤 인터프리터가 실제로 사용되는지 스크립트에서 어떻게 결정할 수 있는지입니다. 다음은 작동하지 않습니다.

echo $0
echo $SHELL

스크립트가 실행 중이면 shebang이 적용되므로 아래 /bin/bash에서 Bash가 아닌 한 Bash입니다. 스크립트가 해석 (소스)되고있는 경우 스크립트를 검사하는 코드가 인터프리터에 유효해야하기 때문에 항상 알 수는 없습니다. 통역사, 심지어 가장 통역사도 사용할 수 있습니다. 비교 : 스크립트가 소스인지 감지하는 방법 .
Kamil Maciorowski 님이

@KamilMaciorowski Nope; shebang은 예를 들어 스크립트를 실행하여 대체됩니다. sh scriptname이는 shebang을 무시하고 "sh"가 처음 인 스크립트를 실행합니다 $PATH.
Gordon Davisson

내가 스크립트처럼 실행 @Gordon ./scriptname, 파일, 실행 가능해야 ps -e보여줍니다 scriptname. 나는 스크립트를 해석 sh scriptname하여 파일이 실행 가능하지 않을 수 있음을 ps -e보여줍니다 sh. 이 두 가지 방법의 이름을 지정하는 방법은 관련이 없습니다. 나의 주요 요점은이 특정 통역사에 대한 준비가되어 있지 않으면 통역사 내에서 통역사에게 알리는 것이 불가능하다는 것입니다. 나에게 감지 스크립트보기 bash로 실행할 때 bash, 감지 python와 함께 실행할 때 python와 감지 bazbaz와 함께 실행할 때 bazbaz(너희가 알지 못하는 통역). 모든 아이디어가 잘못되었습니다.
Kamil Maciorowski

답변:


0

내가 당신을 올바르게 이해한다면, 당신은 스크립트의 첫 줄에서 쉘을 추출하고 싶습니다.

사용할 때 $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")"

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


1
이 쓸모없는 사용 echo아닌가요?
Kamil Maciorowski

@KamilMaciorowski-리터럴 예제이지만 변수에 할당하거나 문자열 비교와 같은 다른 용도를 제안하는 것으로 보입니다.
AFH

이것과 다른 점이 echo "$SHELL"있습니까?
AFH

@kamil echo 'Just an example...' | cat :)
xenoid

@AFH $SHELL는 충분히 신뢰할 수없는 것 같습니다. 편집 된 답변을 참조하십시오.
xenoid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.