シェルスクリプトでは、言語ソルバーはshebang()行で指定できます#!
。私が知っている限り、常にディレクトリにありますが、場所はシステムによって異なる可能性があるため、#!/usr/bin/env bash
使用することをお勧めします。しかし、ユーティリティを使用して直接実行するか、ユーティリティを介して実行する場合、技術的な違いはありますか?また、変数を指定しないと、変更されていない環境で実行されます。そうですか?env
/usr/bin
bash
bash
/bin/bash
env
env
bash
答え1
を使用することは、そのパスが環境に割り当てられるため、そのパス(、、、またはすべてのパス)が関連していないというenv
意味で「移植可能」と見なすことができます。このようにして、スクリプト作成者は自分のスクリプトを様々なシステム上で実行しやすくすることができる。bash
/bin/bash
/usr/bin/bash
/usr/local/bin/bash
~/bin/bash
別の意味では、env
findbash
や他のシェルまたはコマンドソルバーを使用することは、不明なバイナリ (悪意のあるプログラム) がスクリプトを実行するために使用される可能性があるため、セキュリティリスクと見なされます。このような環境では、管理ポリシーに応じてパスが完全なパスを使用して明示的に指定されることがあります#!/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
プロセスツリーをチェックすると、親プロセスもありません。