나는 shebang의 의미가 무엇인지 알아 내려고 노력하고 있습니다.
다음과 같은 스크립트를 작성할 수 있습니다.
#!/usr/bin/env bash
if [ -z "$FOO" ]
then
echo "No FOO"
else
echo "$FOO"
fi
내 환경이 아니고 $FOO
, 등처럼 실행하면 예상대로 "No FOO"가 인쇄됩니다../foo.sh
bash foo.sh
env bash foo.sh
물론 이렇게 실행할 수도 FOO=bar ./foo.sh
있고 인쇄될 것입니다 bar
.
매뉴얼 env
페이지에서는 다음과 같이 호출을 제공합니다.
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
다음과 같이 사용할 수 있습니다.
$ env FOO=bar bash foo.sh
bar
그러나 shebang에서 이 구문을 사용하려고 하면 다음과 같습니다.
#!/usr/bin/env FOO=bar bash
if [ -z "$FOO" ]
then
echo "No FOO"
else
echo "$FOO"
fi
그런 다음 ./foo.sh
무기한 중단되고 실행되지 않습니다.
누구든지 나에게 이것을 설명해 줄 수 있습니까? Shebang이 발생하면 명령을 복사하고 인수 목록 끝에 스크립트 경로를 추가한 다음 실행한다고 가정했지만 이 동작은 그렇지 않음을 암시합니다.
답변1
대부분의 시스템은 최대하나shebang 줄에서 인터프리터 경로 뒤의 인수입니다. 하나 이상의 항목을 제공하는 경우,동작은 시스템에 따라 다릅니다..
Linux에서는 인터프리터 뒤의 모든 항목(앞뒤 공백이나 탭 없음)이 단일 인수로 전달됩니다. 그래서 외침으로 :
#! /usr/bin/env FOO=bar bash
시스템은 및 매개변수를 /usr/bin/env
사용하여 호출합니다 . 그러면 스크립트가 매개변수(환경 내)가 아닌 해당 환경에서 다시 실행되어 무한 루프가 발생합니다.FOO=bar bash
/path/to/the/script
env
FOO=bar bash
bash
/path/to/the/script
FOO=bar
env
최신 버전의 FreeBSD 및 GNU를 포함한 일부 구현은 이 제한 사항을 해결하기 env
위해 자체적으로 분할되도록 지시될 수 있습니다 .-S
존재하다
#! /usr/bin/env -S FOO=bar bash
단일 "-S FOO=bar bash"
인수는 여전히 에 전달되지만 옵션 에 대한 인수는 분할되어 및 별도의 인수로 호출 env
된 것처럼 동작합니다 .env
" FOO=bar bash"
-S
FOO=bar
bash
보다GNU env
매뉴얼또는FreeBSD env
매뉴얼분할 수행 방법에 대한 세부 정보입니다.