編集する: 質問と答えはすべて正確ですが、ここで尋ねる質問はそうではありません。実際、メンテナンス者は拒否する/usr/bin/env
ソリューションとして使用されるのではなく、スクリプトをsh
ソリューションとして再生成すると、他のユーザーのインストールが中断されます。したがって、env
照会用の POSIX ではありませんが、bash
デフォルトは標準と見なされるのに「十分」です。
nixosにソフトウェアをインストールすると、いくつかのエラーが発生します(特にハスケルスタック)そしてインターネットを検索した後、ソフトウェアをインストールする特定のパスに問題がある人の例をいくつか見つけました。ここ/usr/bin/env
1つの例は、他のユーザーのインストールが中断されたため、管理者がbashを探している間にソリューションの変更を元に戻した場合です。
それでは、env
インストールへの絶対パス(システム検索パスに依存しています)を知らせずにshebangを参照することをエラーと見なしますか?
使えるそうですね
#!env bash
変える
#!/usr/bin/env bash
インストールされた絶対パスがenv
すべてのシステムのデフォルトパスではない場合はどうなりますか?
ベストアンサー1
POSIX は shebang を正確に解釈する方法を指定しません。から引用exec
関数シリーズ基本的な:
一般的な歴史的実装は次のとおりです。実装する()、実装する()、 実装する()と実装する()この関数は、実行可能ファイル(シェルスクリプトを含む)として認識されないすべてのファイルに対して[ENOEXEC]エラーを返します。いつ。 。 。いつexeclp()そしてexecvp()関数がこれらのファイルを検出すると、そのファイルがシェルスクリプトであると仮定し、そのファイルを解釈することが知られているコマンドソルバーを呼び出します。 POSIX.1-2008ではこれが必要です。これらの実装execvp()そしてexeclp()[ENOEXEC]エラーは、コマンドソルバーの実行可能ファイルに問題があるまれな場合にのみ発生します。これらの実装により、[ENOEXEC]エラーは言及されません。execlp() またはexecvp()、実装ではまだこれを提供できます。
いくつかの歴史的実装がシェルスクリプトを処理する別の方法は、ファイルの最初の2バイトを"#!"文字列として認識し、ファイルの最初の行の残りの部分を実行するコマンドソルバーの名前として使用することでした。
標準開発者が指摘した混乱の潜在的な原因の1つは、プロセスイメージファイルの内容がexec機能ファミリの動作にどのような影響を与えるかです。以下は、行われたアクションの説明です。
プロセスイメージファイルがシステムに有効な実行可能ファイル(適切な権限を持つ実行可能で有効な形式)の場合、システムはファイルを実行します。
プロセスイメージファイルに適切な権限があり、実行可能であるがそのシステムに無効な形式(たとえば、他のアーキテクチャで認識されるバイナリ)の場合はエラーです。 エラー番号[EINVAL]に設定します(後で[EINVAL]の根拠を参照)。
プロセスイメージファイルに適切な権限があるが認識されない場合:
これが電話だったらexeclp()またはexecvp()、プロセスイメージファイルがシェルスクリプトであると仮定し、コマンドソルバーを呼び出します。
電話じゃなかったらexeclp()またはexecvp()すると、エラーが発生します。エラー番号[ENOEXEC]に設定します。
そして以前は説明する、スクリプトを実行する必要があることがわかりますexeclp
。execvp
sh
Exec関数ファミリの他のメンバーが失敗して設定されている場合エラー番号[ENOEXEC]に、execlp()そしてexecvp() 関数はコマンドソルバーを実行する必要があり、コマンドが実行される環境は呼び出されたプロセスと同じでなければなりません。シェン ユーティリティ使用量実装する()次のように:
execl(<shell path>, arg0, file, arg1, ..., (char *)0);
そのうち<シェルパス>は指定されていないパス名です。シェン ユーティリティとファイルはプロセスイメージファイルです。execvp()、どこ パラメータ0、アルギニン1などは渡された値に対応します。execvp()存在するパラメータv[0]、精液2、等。
したがって、これらの関数の動作はshebangの動作と同じですsh file ...
。スクリプトが POSIX シェルで実行される場合、shebang の効果は指定されません。バラより2.1。シェルについて:
Zshは気にしませんが、bashは次のことを行います。
$ cat foo.sh
#! env perl
echo $0
$ zsh -c ./foo.sh
Can't locate object method "echo" via package "./foo.sh" (perhaps you forgot to load "./foo.sh"?) at ./foo.sh line 2.
$ bash -c ./foo.sh
bash: ./foo.sh: env: bad interpreter: No such file or directory
PATH
shebangで指定されていないクエリに依存しないでください。 (zsh -c ./foo.sh
代わりに実行していることを知っていますが、zsh foo.sh
ここで重要なのは、コマンドを実行するときにシェルが実行する操作が異なる可能性があることを示していることです。)