bash
スクリプトのヘッダーで、これら2つのステートメントの違いは何ですか?
#!/usr/bin/env bash
#!/usr/bin/bash
env
のmanページを見ようとすると、この定義が得られます。
env - run a program in a modified environment
どういう意味ですか?
/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スクリプトを実行するように)。しかし、セキュリティが重視される状況では、コードインジェクションの可能性を制限するため、後者が優先されます。
#!/usr/bin/env NAME
を使用すると、シェルは$ PATH環境変数でNAMEの最初の一致を検索します。絶対パスがわからない場合や検索したくない場合は便利です。
Envコマンドを使用して、/usr/bin/bash/
のようにインタプリタへのパスを明示的に定義する代わりに、インタプリタは最初に見つかった場所から検索され、起動されます。これには 長所と短所 があります。
スクリプトを書き始める前にenvについて知らなかったとき、私はこれをやっていたので、私はそれが便利だと思います。
type nodejs > scriptname.js #or any other environment
それからファイルのその行をShebangに変更しました。
私はこれをやっていました、なぜなら私はいつも私のコンピュータのnodejsがどこにあるか覚えていなかった - /usr/bin /や/ bin /だから私にとってenv
はとても役に立ちます。たぶんこれで詳細があります、しかしこれは私の理由です