web-dev-qa-db-ja.com

「/ bin / bash」または「/ usr / bin / env bash」でbashを開始した場合の違いは何ですか?

シェルスクリプトでは、Shebang(#!)行に言語インタープリターを指定します。私が知る限り、envの場所はシステムによって異なる可能性があるのに対し、bashは常に#!/usr/bin/env bashディレクトリにあるため、/usr/binを使用することをお勧めします。ただし、bash/bin/bashで直接起動した場合、またはenvユーティリティを使用して起動した場合、技術的な違いはありますか?さらに、envに変数を指定しない場合、bashは変更されていない環境で開始されることは正しいですか?

24
Martin

ある意味では、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メソッドはインタープリターへの引数の受け渡しを許可しないことです。

24
Christopher

それとは別に、/usr/bin/envの使用は少し遅いですが、そのようなシバンであるプログラムを開始しても違いはありません。 (/bin/bashが存在しない場合を除き、bashはPATHのどこかに(他の場所に)あります)

envは呼び出されたコマンドの環境を変更する可能性がありますが、これはenvがコマンドラインから起動された場合にのみ使用できます。シバン行(OSによって異なります)では、オプションは使用できません指定する。

envのソース はかなり小さいので、Cに精通していれば、何が行われているかを確認できます。execvpは、実行されるプログラムを呼び出すために使用されます。 。プロセスツリーを調べると、env親プロセスさえありません。

4
Anthon