/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 --

私はこのエラーをUbuntuでのみ見て、shebang hackの文脈でのみ見ました。同じスクリプトがDarwinでもうまく動作します。そしてUbuntuで以下を実行してください。

% /usr/bin/env zsh -

コマンドラインで正常に実行されました。 (実際には「under ubuntu」は「under ubuntu 12.04 LTS and」の略語として理解する必要がありますenv (GNU coreutils) 8.13。)

私の質問は:このエラーを防ぐために上記のShebangをどのように修正する必要がありますか?

もちろん、末尾を削除すると-エラーが取り除かれることがわかりますが、これは許容可能な解決策ではありません。この資料の残りの部分では、その理由について説明します。

エラーを引き起こすshebang行は、完全に独立した2つのガイドラインに準拠するために発生します。

  1. スクリプトを移植可能に#!/usr/bin/env <cmd ...>するには#!/path/to/cmd <...>

  2. zshスクリプトのshebang行で唯一のパラメータとして使用すると、特定の-種類のzsh攻撃

したがって、私の質問を次のようにより正確に再説明できます。上記のエラーを発生させることなく、Ubuntuでこれら2つのガイドラインを満たすことはできますか?

ベストアンサー1

Linux(「Ubuntuでのみ」と呼ばれていましたが、動作すると言われている唯一のOSはDarwinです)では、「shebang」インタプリタへの複数の引数渡しをサポートしていません。文字列全体(あなたの場合"zsh -")を単一の引数として渡します。

パッケージがインタプリタの場所に依存しないようにする正しい方法は、インタプリタを探し、インストールプロセスの一部として正しいパスを含めるようにスクリプトを変更することです。これを行うためのいくつかのサンプルコード(についてsh)は、以下に提供されています。http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html#tag_20_117_16

おすすめ記事