Shebang에서 환경 변수를 어떻게 사용합니까?

Shebang에서 환경 변수를 어떻게 사용합니까?

특정 Python 설치로 실행해야 하는 Python 스크립트가 있습니다. shebang과 함께 실행되도록 만드는 방법이 있나요 $FOO/bar/MyCustomPython?

답변1

Shebang 라인은 매우 제한적입니다. 많은 UNIX 변형(Linux 포함)에서는 명령과 인수라는 두 단어만 있을 수 있습니다. 일반적으로 길이 제한도 있습니다.

일반적인 해결책은 작은 쉘 래퍼를 작성하는 것입니다. Python 스크립트에 이름을 지정한 foo.py다음 그 옆에 쉘 스크립트를 놓고 foo.py호출하십시오 foo. 이 방법에는 Python 스크립트에 특정 헤더가 필요하지 않습니다.

#!/bin/sh
exec "$FOO/bar/MyCustomPython" "$0.py" "$@"

또 다른 매력적인 접근 방식은 위와 같은 래퍼 스크립트를 작성하여 #!/path/to/wrapper/scriptPython 스크립트 위에 shebang 줄로 배치하는 것입니다. 그러나 대부분의 unices는 shebang 스크립트 연결을 지원하지 않으므로 작동하지 않습니다.

MyCustomPython에 있는 경우 다음을 사용하여 찾을 $PATH수 있습니다 env.

#!/usr/bin/env MyCustomPython
import …

또 다른 접근 방식은 스크립트를 유효한 쉘 스크립트(자체적으로 올바른 Python 인터프리터를 로드함)이자 대상 언어(여기서는 Python)의 유효한 스크립트로 정렬하는 것입니다. 이를 위해서는 대상 언어에 대한 이중 언어 스크립트를 작성하는 방법을 찾아야 합니다. Perl에서는 이것을 이렇게 부릅니다.if $running_under_some_shell.

#!/bin/sh
eval 'exec "$FOO/bar/MyCustomPerl" -wS $0 ${1+"$@"}'
    if $running_under_some_shell;
use …

Python에서 동일한 효과를 얻는 한 가지 방법은 다음과 같습니다. 셸에서는 해당 인수(두 개의 단일 문자 문자열의 합 ) 를 무시 하고 참 값을 반환하는 유틸리티 "true"입니다 . Python에서 는 부울로 해석될 때 참인 문자열이므로 항상 참이고 문자열 리터럴을 실행하는 명령입니다.true:'"true"if

#!/bin/sh
if "true" : '''\'
then
exec "$FOO/bar/MyCustomPython" "$0" "$@"
exit 127
fi
'''
import …

Rosetta Code에는 여러 다른 언어로 된 이중 언어 스크립트가 있습니다.

답변2

$FOO/MyCustomPythonShebang 라인은 변수 확장을 하지 않아서 Dollar-FOO-....라는 실행 파일을 검색하기 때문에 사용할 수 없습니다.

또 다른 접근 방식은 shebang이 쉘 스크립트를 인터프리터로 가리키도록 하는 것입니다. 그러면 쉘 스크립트는 환경 변수를 사용하여 올바른 스크립트를 찾고 실행할 수 있습니다.

mypython.sh예: 다음 내용을 사용하여 (또는 사용자의 다른 디렉터리)에 스크립트를 만듭니다 ./usr/local/bin$PATH

#! /bin/sh
PYTHON="$FOO/bar/MyCustomPython"
exec "$PYTHON" "$@"

MyCustomPython그런 다음 이 Shebang 라인을 사용하여 다음을 통해 Python 스크립트를 실행할 수 있습니다 mypython.sh.

#!/usr/bin/env mypython.sh

답변3

사용자 정의 Python 설치에 대한 절대 경로를 사용하거나 이를 사용자 경로에 넣고 $PATH사용할 수 있습니다 #!/usr/bin/env [command]. 그렇지 않으면 래퍼를 작성하고 이를 사용하여 exec프로세스 이미지를 대체합니다. 예:

#!/bin/bash
exec "$ENV/python" "$@"

답변4

$FOOin을 특정 경로 옵션으로 바꿀 수 있는 경우 , $FOO/bar/MyCustomPython해당 경로에 직접 env사용자 정의 라인을 설정하여 사용자 정의 Python 버전을 찾을 위치를 shebang에 알릴 수 있습니다.PATH

#!/usr/bin/env PATH="/path1/to/MyCustomPython:/path2/to/MyCustomPython" python

편집하다:PATH 값 할당에 따옴표가 없는 경우에만 작동하는 것 같습니다.

#!/usr/bin/env PATH=/path1/to/MyCustomPython:/path2/to/MyCustomPython python

관련 정보