shebang을 사용하여 #!/usr/bin/env python
스크립트를 실행할 때 시스템은 python
어떤 스크립트를 사용할지 어떻게 알 수 있나요? python
환경 변수에서 bin 경로를 찾으면 아무것도 찾을 수 없습니다 .
env | grep -i python
답변1
이것셰르본라인("sharp bang", 즉 #!
)은 커널에 의해 처리됩니다. 커널은 이와 같은 환경 변수에 대해 알고 싶어하지 않습니다 PATH
. 따라서 shebang 줄의 이름은 실행 파일의 절대 경로여야 합니다. 스크립트 이름 앞에 실행 파일에 전달할 추가 인수를 지정할 수도 있습니다(여기에서는 설명하지 않는 시스템 관련 제한 사항 있음). 예를 들어 Python 스크립트의 경우 다음을 지정할 수 있습니다.
#!/usr/bin/python
첫 번째 줄에서는 스크립트를 실행할 때 커널이 실제로 실행됩니다 /usr/bin/python /path/to/script
. 그러나 이는 편리하지 않습니다. 명령의 전체 경로를 지정해야 합니다. 일부 컴퓨터와 다른 컴퓨터에 대한 권한이 있으면 python
어떻게 됩니까 ? 아니면 특정 버전의 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
#!/usr/bin/env python
답변2
shebang에는 인터프리터가 사용하는 전체 경로가 필요하므로 다음 구문은 올바르지 않습니다.
#!python
다음과 같이 전체 경로를 설정하면 효과가 있을 수 있습니다.
#!/usr/local/bin/python
/bin
그러나 Python은 이나 /opt/python/bin
다른 위치 에 설치될 수 있으므로 이식성이 없습니다 .
사용env
#!/usr/bin/env python
python
와 동등한 운영 체제에 대한 전체 경로를 지정하는 이식 가능한 방법을 허용하는 방법입니다 PATH
.
답변3
맞습니다. 다음을 실행하세요.
env | grep PATH
$PATH는 디렉토리 목록입니다. Unix는 "python"을 찾을 때까지 디렉토리 목록을 순차적으로 탐색합니다.
"which" 명령을 사용하여 찾은 디렉터리를 확인할 수 있습니다.
which python