web-dev-qa-db-ja.com

"#!/ usr / bin / env bash"と "#!/ usr / bin / bash"の違いは何ですか?

bashスクリプトのヘッダーで、これら2つのステートメントの違いは何ですか?

  1. #!/usr/bin/env bash

  2. #!/usr/bin/bash

envのmanページを見ようとすると、この定義が得られます。

 env - run a program in a modified environment

どういう意味ですか?

291
tarrsalah

/usr/bin/envを介してコマンドを実行すると、現在のenvの中にデフォルトのプログラムバージョンが何であるかを探すという利点があります。

この方法では、システム上の特定の場所で探す必要はありません。これらのパスはシステムごとに異なる場所にある場合があるためです。それがあなたの進路にある限り、それはそれを見つけるでしょう。

1つの欠点は、 POSIXは曖昧な であるため、Linuxをサポートしたいのであれば、複数の引数を渡すことができない(たとえば/usr/bin/env awk -fを記述できない)ことです。と解釈され、Linuxは最初のスペース以降のすべてを解釈して単一の引数を表します。これを回避するためにenvのいくつかのバージョンで/usr/bin/env -Sを使うことができますが、それからスクリプトはさらに可搬性がなくなり、かなり最近のシステムでは壊れるでしょう(例えば、Ubuntu 16.04でさえ後でないなら)。

もう1つの欠点は、明示的な実行可能ファイルを呼び出していないため、間違いやマルチユーザーシステムでのセキュリティ上の問題が発生する可能性があることです(たとえば、パスにbashという実行可能ファイルがある場合)。

#!/usr/bin/env bash #lends you some flexibility on different systems
#!/usr/bin/bash     #gives you explicit control on a given system of what executable is called

いくつかの状況では、最初のものが好まれるかもしれません(実行可能な行を作り直す必要なしに、pythonの複数のバージョンでpythonスクリプトを実行するように)。しかし、セキュリティが重視される状況では、コードインジェクションの可能性を制限するため、後者が優先されます。

264
Alec Bennett

#!/usr/bin/env NAMEを使用すると、シェルは$ PATH環境変数でNAMEの最初の一致を検索します。絶対パスがわからない場合や検索したくない場合は便利です。

49
Dolphiniac

Envコマンドを使用して、/usr/bin/bash/のようにインタプリタへのパスを明示的に定義する代わりに、インタプリタは最初に見つかった場所から検索され、起動されます。これには 長所と短所 があります。

11
safay

スクリプトを書き始める前にenvについて知らなかったとき、私はこれをやっていたので、私はそれが便利だと思います。

type nodejs > scriptname.js #or any other environment

それからファイルのその行をShebangに変更しました。
私はこれをやっていました、なぜなら私はいつも私のコンピュータのnodejsがどこにあるか覚えていなかった - /usr/bin /や/ bin /だから私にとってenvはとても役に立ちます。たぶんこれで詳細があります、しかしこれは私の理由です

3
sudo97