「/bin/bash」または「/usr/bin/env bash」でbashを起動した場合の違いは何ですか? [コピー]

「/bin/bash」または「/usr/bin/env bash」でbashを起動した場合の違いは何ですか? [コピー]

シェルスクリプトでは、言語ソルバーはshebang()行で指定できます#!。私が知っている限り、常にディレクトリにありますが、場所はシステムによって異なる可能性があるため、#!/usr/bin/env bash使用することをお勧めします。しかし、ユーティリティを使用して直接実行するか、ユーティリティを介して実行する場合、技術的な違いはありますか?また、変数を指定しないと、変更されていない環境で実行されます。そうですか?env/usr/binbashbash/bin/bashenvenvbash

答え1

を使用することは、そのパスが環境に割り当てられるため、そのパス(、、、またはすべてのパス)が関連していないというenv意味で「移植可能」と見なすことができます。このようにして、スクリプト作成者は自分のスクリプトを様々なシステム上で実行しやすくすることができる。bash/bin/bash/usr/bin/bash/usr/local/bin/bash~/bin/bash

別の意味では、envfindbashや他のシェルまたはコマンドソルバーを使用することは、不明なバイナリ (悪意のあるプログラム) がスクリプトを実行するために使用される可能性があるため、セキュリティリスクと見なされます。このような環境では、管理ポリシーに応じてパスが完全なパスを使用して明示的に指定されることがあります#!/bin/bash

一般に、envリスクの詳細を詳しく調査している環境の1つに書いていることがわからない場合は、この方法を使用してください。

2011年にUbuntuが初めて使用され始めたとき、dashこの作業により多くのスクリプトが破損しました。これについてはaskubuntu.comで議論されています。ほとんどのスクリプトは#!/bin/shリンクを介して作成されます/bin/bash。合意は次のとおりです。スクリプト作成者はインタプリタを指定する責任があります。したがって、スクリプトが常にBASH呼び出しを使用する必要がある場合は、環境でこれを指定してください。これにより、さまざまなUnix / Linuxシステムで異なる可能性のあるパスを推測する必要がなくなります。また明日/bin/sh/bin/newsh

別の違いは、このenv方法ではパラメータがインタプリタに渡されることを許可しないことです。

答え2

使用速度がやや遅くなる以外は、/usr/bin/envこのようなプログラムを実行しても違いはありません。 ( /bin/bash存在しないがbashルートのどこかにある場合は除く)

envコマンドが呼び出される環境を変更することは可能ですが、コマンドラインenvで実行している場合にのみShebang行でオプションを指定することはできません(オペレーティングシステムによって異なります)。

これ源泉envかなり小さいので、Cに慣れているなら、それが何をしているのかを確認できます。後でexecvp実行されるプログラムを呼び出すために使用されます。envプロセスツリーをチェックすると、親プロセスもありません。

関連情報