shebang 헤더는 항상 인터프리터의 설치 디렉터리와 일치해야 합니까? 그렇다면 왜 둘 다 나에게 효과적입니까 #!/usr/bin/python
?#!/usr/local/bin/python
답변1
다른 사람들이 지적했듯이 shebang 줄은 존재하는 실제 파일을 참조해야 합니다.
이는 서로 다른 시스템이 서로 다른 위치에 바이너리를 설치할 수 있기 때문에 스크립트 이식성의 약점입니다.
다른 사람들이 언급했듯이 이 문제를 해결하는 한 가지 방법은 링크를 사용하는 것입니다.
또 다른 방법은 시스템의 올바른 경로를 참조하도록 스크립트를 편집하는 것입니다.
/usr/bin/env
이 문제를 해결하는 또 다른 방법은 PATH에서 실행 파일을 찾는 를 사용하는 것입니다 .
그래서 대신:
#!/usr/bin/python
쓰다:
#!/usr/bin/env python
이렇게 하면 /usr/bin/env
각 개별 실행 파일이 아닌 필요할 때만 심볼릭 링크를 연결하면 됩니다.
물론 제대로 작동하려면 실행 파일이 PATH에 있어야 합니다.
보시다시피 100% 깨끗한 솔루션은 없습니다. 기억하세요: “더 나쁠수록 좋습니다” (:
답변2
(shebang) 줄은 #!
실제 실행 파일을 지정해야 합니다. 둘 다 시스템에서 실행 중이면 두 위치 모두에 Python이 설치되어 있음을 의미합니다. 아니면 심볼릭 링크일 수도 있습니다.
일반적으로 존재하지 않는 인터프리터를 사용하려고 하면 오류가 발생합니다.
anthony@Zia:~$ /tmp/test
bash: /tmp/test: /usr/local/bin/python: bad interpreter: No such file or directory
다음과 같이 스크립트를 실행하면 경로는 중요하지 않을 수 있습니다.
anthony@Zia:~$ python /tmp/test
anthony@Zia:~$
Python을 직접 실행하여 인수를 전달하기 때문입니다. 그런 다음 Python은 파일을 열고 이를 스크립트로 처리하기로 결정합니다. 첫 번째 경우, 커널은 스크립트를 실행 파일로 실행하려고 합니다. 이를 확인하고 shebang 줄을 알아차린 후 실제로 실행할 수 있도록 두 번째 형식으로 변환하려고 시도합니다. 나중에 제공된 경로가 #!
실제로 존재하지 않으면 실패합니다.
답변3
Shebang은 다음 문자의 조합입니다. #!
스크립트의 첫 번째 줄에 나타날 때. 아래 문자열은 항상 인터프리터의 경로입니다. /usr/bin/python
정확히 무엇인지 확인해 보겠습니다 /usr/local/bin/python
. 그 중 하나는 다른 하나에 대한 기호 링크일 수 있습니다. 다음 명령의 출력을 제공할 수 있습니까?
ls -l /usr/bin/python
ls -l /usr/local/bin/python