/ usr / bin / env는 어떤 프로그램을 사용해야하는지 어떻게 알 수 있습니까?


62

shebang #!/usr/bin/env python을 사용하여 스크립트를 실행할 때 시스템은 어떤 python것을 사용 해야하는지 어떻게 알 수 있습니까? 내가 찾는 경우 python환경 변수에 빈 경로 나는 아무것도 찾을 수 없습니다.

env | grep -i python

6
오, 내가 알아
낸 것 같아

나도 그것에 대해 궁금했다. 왜 / usr / bin / env? env에서 경로 목록을 가져 오는 경우 / bin / env 또는 env와 달리?
Faheem Mitha

'env'는 전체 경로 여야하기 때문에 작동하지 않습니다. 'env'프로그램은 보통 / user / bin / env에 있습니다. 일부 배포판에서는 / bin / env로 표시 될 수도 있지만 / usr / bin / env와 함께 사용하는 것이 더 안전합니다.
rettops

답변:


54

shebang은 해석기가 사용할 전체 경로를 예상하므로 다음 구문이 올바르지 않습니다.

#!python

다음과 같이 전체 경로를 설정하면 작동 할 수 있습니다.

#!/usr/local/bin/python

파이썬은에 설치되어있을 수 있습니다으로하지만, 비 휴대용 것 /bin, /opt/python/bin다른 위치를, 또는 어디든지.

사용 env

#!/usr/bin/env python

는 이식 가능한 방법으로 OS에 python처음으로 위치한 경로와 동일한 전체 경로를 OS에 지정할 수있는 방법 PATH입니다.


56

당면한의 ( "날카로운 쾅", 즉, 행 라인 #!)은 커널에 의해 처리된다. 커널은와 같은 환경 변수에 대해 알고 싶지 않습니다 PATH. 따라서 shebang 행의 이름은 실행 파일의 절대 경로 여야합니다. 스크립트 이름 앞에 해당 실행 파일에 전달할 추가 인수를 지정할 수도 있습니다 (시스템 종속 제한 사항은 여기서 다루지 않습니다). 예를 들어 Python 스크립트의 경우 다음을 지정할 수 있습니다.

#!/usr/bin/python

첫 번째 줄에서 스크립트를 실행하면 실제로 커널이 실행 /usr/bin/python /path/to/script됩니다. 그러나 편리하지 않습니다. 명령의 전체 경로를 지정해야합니다. 당신은 어떤 경우 python/usr/bin일부 시스템에서와 /usr/local/bin다른 사람? 또는 당신은 당신을 설정할 PATH하기 /home/joe/opt/python-2.5/bin때문에 파이썬의 특정 버전을 사용하기로? 커널은 PATH당신을 위해 검색을 하지 않기 때문에, 커널은 다음 명령에서 원하는 인터프리터를 찾는 명령을 실행하도록하는 것입니다 PATH.

#!/fixed/path/to/path-lookup-command python

path-lookup-command인수로 실행 파일의 이름을 가지고 그것을 찾아 있어야 PATH하고 실행 : 커널이 실행됩니다 /fixed/path/to/path-lookup-command python /path/to/script. 그것이 일어날 때, env명령은 바로 그 일을합니다. 주요 목적은 다른 환경에서 명령을 실행하는 것이지만에서 명령 이름을 조회하므로 $PATH여기서는 목적에 완벽합니다.

비록 이것이 공식적으로 보장되지는 않지만, 유닉스 시스템 과 현대 시스템 env에서 제공되는 역사적인 유닉스 시스템 /usr/bin은의 광범위한 사용으로 인해 그 위치를 정확하게 유지했습니다 #!/usr/bin/env. 따라서 실제로 사용자가 선호하는 Python 인터프리터가 스크립트를 실행하도록 지정하는 방법은 다음과 같습니다.

#!/usr/bin/env python

2
어느 하나의 사이에 바람직 env하고 which? PATH 환경에서 가장 적합한 실행 파일을 얻습니다.
Nikhil Mulley

8
@NikhilMulley which는 실행 파일을 찾아 경로를 인쇄합니다. env첫 번째 인수로 지정된 프로그램을 찾아서 실행하여 나머지 인수를 전달합니다.
케빈

3
그래서 그것은이다 env의 평가 버전입니다 which본질적으로.
Nikhil Mulley

6

그렇습니다.

env | grep PATH

$ PATH는 디렉토리 목록입니다. 유닉스는 "파이썬"을 찾을 때까지 그 디렉토리 목록을 순서대로 살펴 본다.

'which'명령으로 찾은 디렉토리를 확인할 수 있습니다.

which python

흥미롭게도, sys.path활성화 된 env $ env python3 ( ['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'])와 ./env/bin/python3 (['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']) 사이 에 파이썬의 차이가 있습니다.
ThorSummoner 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.