エラーが発生しました。
/usr/bin/env: zsh -: No such file or directory
zsh
...次のshebang行で始まる実行可能スクリプトを実行するとき:
#!/usr/bin/env zsh -
また、FWIW、-
同様の苦情の理由を印刷することに置き換えてください--
。/usr/bin/env
zsh --
私はこのエラーを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つのガイドラインに準拠するために発生します。
スクリプトを移植可能に
#!/usr/bin/env <cmd ...>
するには#!/path/to/cmd <...>
。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。
答え2
あなたの質問に対する答えは基本的に「いいえ」だと思います。 Shebangメカニックはそれほど柔軟ではありません。
この#!
行では、実行するコマンドと(オプションで)コマンドの単一引数のみを指定できます。スクリプト名は他のパラメータに渡されます。したがって、foo.zsh
次のように起動すると:
#!/usr/bin/env zsh
ランニングfoo.zsh
はランニングと同じです/usr/bin/env zsh foo.zsh
。
パスを直接指定した場合は、追加のzsh
パラメータを渡すことができます。
#!/usr/bin/zsh -
しかし、#!/usr/bin/env
ハッカーの侵入によってzsh
はい追加のパラメータ。
ご覧のとおり、この動作はシステムによって異なります。しかし、-
Ubuntuで無視されないことを確認してみましょう。
zsh
関心のあるすべてのシステムで一貫した場所にいる可能性があると信じることができれば問題ありません#!/usr/bin/zsh -
(最初のガイドラインは無視)。
そうでない場合は、zsh
各システムの一貫した場所にシンボリックリンクを作成するか、#!
スクリプトをインストールするときにスクリプトの行を変更できます。 (Perlが常に存在していなかった頃は、Perlスクリプトのためにこれを直接実行しました/usr/bin/perl
。)
zsh
あるいは、引数なしで呼び出すときに引数で呼び出されるラッパーを作成し、-
shebangを次のように変更することもできます。
#!/usr/bin/env zsh-wrapper
必ずしも一貫した位置にある必要はなく、zsh-wrapper
どこかにあります。$PATH
また、見ることができますこの問題そしてこれに対する私の答え#!/usr/bin/env
このハッキングの長所と短所について話し合ってください。
そして見なさいこのページさまざまなUnixシリーズシステムのSheban動作に関する追加情報(リンクを提供しているStephane Chazelasに感謝します)。