Bash スクリプトのヘッダーで、これら 2 つのステートメントの違いは何ですか。
#!/usr/bin/env bash
#!/usr/bin/bash
env
man pageを調べたところ、次の定義が得られました。
env - run a program in a modified environment
どういう意味ですか?
コマンドを実行する/usr/bin/env
と、現在の環境にあるプログラムのデフォルト バージョンを検索できるという利点があります。
この方法では、システムの特定の場所でパスを探す必要はありません。これらのパスは、異なるシステムの異なる場所にある可能性があるためです。それがあなたのパスにある限り、それを見つけます。
/usr/bin/env awk -f
欠点の 1 つは、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 スクリプトを実行し、実行可能行を作り直す必要がない場合など)。ただし、セキュリティが重視される状況では、コード インジェクションの可能性が制限されるため、後者が優先されます。