오류가 발생했습니다.
/usr/bin/env: zsh -: No such file or directory
zsh
... 다음 shebang 줄로 시작하는 실행 가능한 스크립트를 실행할 때 :
#!/usr/bin/env zsh -
또한 FWIW, -
유사한 불만 사항에 대한 이유를 인쇄하는 것으로 대체하십시오 --
./usr/bin/env
zsh --
나는 이 오류를 우분투에서만 보았고, shebang hack의 맥락에서만 보았습니다. 동일한 스크립트가 Darwin에서도 잘 실행됩니다. 그리고 우분투에서 다음을 실행하세요.
% /usr/bin/env zsh -
명령줄에서 성공적으로 수행되었습니다. (실제로 "under ubuntu"는 "under ubuntu 12.04 LTS and"의 약어로 이해해야 합니다 env (GNU coreutils) 8.13
.)
내 질문은: 이 오류를 방지하려면 위의 Shebang을 어떻게 수정해야 합니까?
물론 후행을 제거하면 -
오류가 제거된다는 것을 알고 있지만 이는 수용 가능한 해결책이 아닙니다. 이 문서의 나머지 부분에서는 그 이유를 설명합니다.
오류를 일으키는 shebang 줄은 완전히 독립적인 두 가지 지침을 준수하기 위해 발생합니다.
스크립트를 이식 가능하게 만들
#!/usr/bin/env <cmd ...>
려면#!/path/to/cmd <...>
.zsh 스크립트의 shebang 줄에서 유일한 매개변수로 사용하면
-
특정 유형의zsh
공격.
따라서 내 질문을 다음과 같이 더 정확하게 다시 설명할 수 있습니다. 위에 표시된 오류를 발생시키지 않고 우분투에서 이 두 가지 지침을 충족할 수 있습니까?
답변1
Linux("Ubuntu에서만"이라고 언급했지만 작동한다고 언급한 유일한 OS는 Darwin입니다)는 "shebang" 인터프리터에 여러 인수 전달을 지원하지 않습니다. 전체 문자열(귀하의 경우 "zsh -"
)을 단일 인수로 전달합니다.
패키지가 인터프리터의 위치에 의존하지 않도록 하는 올바른 방법은 인터프리터를 찾고 설치 프로세스의 일부로 올바른 경로를 포함하도록 스크립트를 수정하는 것입니다. 이를 수행하기 위한 몇 가지 예제 코드( 에 대해 sh
)는 다음에서 제공됩니다.http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_16.
답변2
귀하의 질문에 대한 대답은 기본적으로 "아니오"라고 생각합니다. Shebang 정비공은 그다지 유연하지 않습니다.
이 #!
줄에서는 실행할 명령과 (선택적으로) 명령에 대한 단일 인수만 지정할 수 있습니다. 스크립트 이름은 다른 매개변수로 전달됩니다. 따라서 foo.zsh
다음과 같이 시작하면:
#!/usr/bin/env zsh
달리기 foo.zsh
는 달리기와 같습니다 /usr/bin/env zsh foo.zsh
.
경로를 직접 지정하는 경우 zsh
추가 매개변수를 전달할 수 있습니다.
#!/usr/bin/zsh -
하지만 #!/usr/bin/env
해커의 침입 으로zsh
예추가 매개변수.
보시다시피 이 동작은 시스템마다 다릅니다. 그런데 -
우분투에서 무시되지 않는지 확인해 보겠습니다 .
zsh
관심 있는 모든 시스템에서 일관된 위치에 있을 수 있다고 믿을 수 있다면 괜찮습니다 #!/usr/bin/zsh -
(첫 번째 지침은 무시).
그렇지 않은 경우 zsh
각 시스템의 일관된 위치에 기호 링크를 만들거나 #!
스크립트를 설치할 때 스크립트의 줄을 수정할 수 있습니다. (Perl이 항상 존재하지 않았던 시절에는 Perl 스크립트를 위해 이 작업을 직접 수행했습니다 /usr/bin/perl
.)
zsh
또는 인수 없이 호출할 때 인수와 함께 호출 되는 래퍼를 작성 -
하고 shebang을 다음과 같이 변경할 수 있습니다.
#!/usr/bin/env zsh-wrapper
반드시 일관된 위치에 있을 필요는 없으며 의 zsh-wrapper
어딘가에 있어야 합니다 .$PATH
당신은 또한 볼 수 있습니다이 문제그리고이에 대한 나의 대답#!/usr/bin/env
이 해킹의 장점과 단점에 대해 토론하십시오 .
그리고 봐라이 페이지다양한 Unix 계열 시스템의 Shebang 동작에 대한 추가 정보(링크를 제공한 Stephane Chazelas에게 감사드립니다).