/usr/bin/env: zsh -: 해당 파일이나 디렉터리가 없습니다.

/usr/bin/env: zsh -: 해당 파일이나 디렉터리가 없습니다.

오류가 발생했습니다.

/usr/bin/env: zsh -: No such file or directory

zsh... 다음 shebang 줄로 시작하는 실행 가능한 스크립트를 실행할 때 :

#!/usr/bin/env zsh -

또한 FWIW, -유사한 불만 사항에 대한 이유를 인쇄하는 것으로 대체하십시오 --./usr/bin/envzsh --

나는 이 오류를 우분투에서만 보았고, shebang hack의 맥락에서만 보았습니다. 동일한 스크립트가 Darwin에서도 잘 실행됩니다. 그리고 우분투에서 다음을 실행하세요.

% /usr/bin/env zsh -

명령줄에서 성공적으로 수행되었습니다. (실제로 "under ubuntu"는 "under ubuntu 12.04 LTS and"의 약어로 이해해야 합니다 env (GNU coreutils) 8.13.)

내 질문은: 이 오류를 방지하려면 위의 Shebang을 어떻게 수정해야 합니까?

물론 후행을 제거하면 -오류가 제거된다는 것을 알고 있지만 이는 수용 가능한 해결책이 아닙니다. 이 문서의 나머지 부분에서는 그 이유를 설명합니다.

오류를 일으키는 shebang 줄은 완전히 독립적인 두 가지 지침을 준수하기 위해 발생합니다.

  1. 스크립트를 이식 가능하게 만들 #!/usr/bin/env <cmd ...>려면 #!/path/to/cmd <...>.

  2. 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에게 감사드립니다).

관련 정보