シェルスクリプトでは、Shebang(#!
)行に言語インタープリターを指定します。私が知る限り、env
の場所はシステムによって異なる可能性があるのに対し、bash
は常に#!/usr/bin/env bash
ディレクトリにあるため、/usr/bin
を使用することをお勧めします。ただし、bash
を/bin/bash
で直接起動した場合、またはenv
ユーティリティを使用して起動した場合、技術的な違いはありますか?さらに、env
に変数を指定しない場合、bash
は変更されていない環境で開始されることは正しいですか?
ある意味では、env
の使用は、bash
へのパスが関連しないという点で「ポータブル」と見なすことができます(/bin/bash
、/usr/bin/bash
、/usr/local/bin/bash
、~/bin/bash
、またはその他のパス)環境で指定されているため。このようにして、スクリプト作成者は、多くの異なるシステムでスクリプトを実行しやすくすることができます。
別の意味では、env
を使用してbash
やその他のシェルまたはコマンドインタープリターを検索することは、スクリプトの実行に不明なバイナリ(マルウェア)が使用される可能性があるため、セキュリティリスクと見なされます。これらの環境では、場合によっては管理ポリシーによって、パスが完全パス#!/bin/bash
で明示的に指定されます。
一般に、リスクの細部を精査するこれらの環境の1つで記述していることがわかっている場合を除き、env
を使用します。
Ubuntuが最初にdash
を使い始めたとき、2011年のある時点で、そのアクションによって多くのスクリプトが壊れました。 askubuntu.comでそれについての議論がありました。ほとんどのスクリプトは#!/bin/sh
へのリンクである/bin/bash
で書かれていました。コンセンサスはこれでした:スクリプトの作成者はインタープリターを指定する責任があります。したがって、スクリプトを常にBASHで呼び出す必要がある場合は、環境から指定してください。これにより、パスを推測する必要がなくなります。これは、さまざまなUnix/Linuxシステムでは異なります。さらに、明日/bin/sh
が/bin/newsh
のような他のシェルへのリンクになれば機能します。
別の違いは、env
メソッドはインタープリターへの引数の受け渡しを許可しないことです。
それとは別に、/usr/bin/env
の使用は少し遅いですが、そのようなシバンであるプログラムを開始しても違いはありません。 (/bin/bash
が存在しない場合を除き、bash
はPATHのどこかに(他の場所に)あります)
env
は呼び出されたコマンドの環境を変更する可能性がありますが、これはenv
がコマンドラインから起動された場合にのみ使用できます。シバン行(OSによって異なります)では、オプションは使用できません指定する。
env
のソース はかなり小さいので、Cに精通していれば、何が行われているかを確認できます。execvp
は、実行されるプログラムを呼び出すために使用されます。 。プロセスツリーを調べると、env
親プロセスさえありません。