#!/usr/bin/env가 NAME=VALUE로 중단됩니다.

#!/usr/bin/env가 NAME=VALUE로 중단됩니다.

나는 shebang의 의미가 무엇인지 알아 내려고 노력하고 있습니다.

다음과 같은 스크립트를 작성할 수 있습니다.

#!/usr/bin/env bash

if [ -z "$FOO" ]
then
    echo "No FOO"
else
    echo "$FOO"
fi

내 환경이 아니고 $FOO, 등처럼 실행하면 예상대로 "No FOO"가 인쇄됩니다../foo.shbash foo.shenv 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/scriptenvFOO=bar bashbash/path/to/the/scriptFOO=bar

env최신 버전의 FreeBSD 및 GNU를 포함한 일부 구현은 이 제한 사항을 해결하기 env위해 자체적으로 분할되도록 지시될 수 있습니다 .-S

존재하다

#! /usr/bin/env -S FOO=bar bash

단일 "-S FOO=bar bash"인수는 여전히 에 전달되지만 옵션 에 대한 인수는 분할되어 및 별도의 인수로 호출 env된 것처럼 동작합니다 .env" FOO=bar bash"-SFOO=barbash

보다GNU env매뉴얼또는FreeBSD env매뉴얼분할 수행 방법에 대한 세부 정보입니다.

관련 정보