1. ホーム
  2. linux

[解決済み] usr/bin/env bash」と「#!/usr/bin/bash」の違いは何ですか?

2022-01-31 15:32:44

質問

Bashスクリプトのヘッダーで、これらの2つの文の違いは何ですか。

  1. #!/usr/bin/env bash

  2. #!/usr/bin/bash

を相談したところ env マンページ をクリックすると、このような定義が得られます。

 env - run a program in a modified environment

どういう意味ですか?

どのように解決するのですか?

を介してコマンドを実行する /usr/bin/env は、そのプログラムのデフォルトのバージョンが何であれ、現在の 環境 のアイロメントを使用します。

この方法では、それらのパスがシステムによって異なる場所にある可能性があるため、システム上の特定の場所から探す必要はありません。 パスの中にある限り、それを見つけることができるのです。

デメリットとしては、複数の引数を渡すことができなくなることです(例:以下のように書くことができなくなります)。 /usr/bin/env awk -f のように、Linux をサポートしたい場合は POSIXは曖昧 Linuxでは、最初のスペース以降を1つの引数として解釈します。また /usr/bin/env -S のいくつかのバージョンで env を使えば回避できますが、そうするとスクリプトの移植性がさらに低下し、かなり最近のシステム(例えば、Ubuntu 16.04以降でなくても)で壊れてしまうことになります。

もうひとつの欠点は、明示的に実行ファイルを呼び出しているわけではないので、ミスの可能性があることと、マルチユーザーシステムでのセキュリティの問題です(もし誰かが自分の実行ファイルを 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スクリプトを実行する場合、実行行を作り直す必要がありません)。 しかし、セキュリティが重視される状況では、コードインジェクションの可能性を制限するために、後者が好まれるでしょう。