Bash スクリプトのヘッダーにある次の 2 つのステートメントの違いは何ですか。
#!/usr/bin/env bash
#!/usr/bin/bash
私が相談したときenv
マニュアルページ、私はこの定義を得ました:
env - run a program in a modified environment
それはどういう意味ですか?
ベストアンサー1
コマンドを実行すると、現在の環境/usr/bin/env
にあるプログラムのデフォルト バージョンを検索できるという利点があります。
この方法であれば、システム上の特定の場所で探す必要はありません。パスはシステムによって異なる場所にある可能性があるからです。パス内にある限り、見つかります。
/usr/bin/env awk -f
欠点としては、Linuxをサポートしたい場合、複数の引数を渡すことができない(例えば、 と書くことができない)ことです。POSIXは曖昧だ行の解釈方法には制限があり、Linux は最初のスペースの後のすべてを単一の引数として解釈します。/usr/bin/env -S
のいくつかのバージョンではenv
これを回避するため を使用できますが、スクリプトの移植性はさらに低下し、比較的最近のシステム (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 スクリプトを実行する場合など)。ただし、セキュリティが重視される状況では、コード インジェクションの可能性を制限するため、後者の方が好まれます。