shebang은 항상 통역사의 설치 디렉토리와 동일한 디렉토리입니까?

shebang은 항상 통역사의 설치 디렉토리와 동일한 디렉토리입니까?

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

관련 정보