コマンドの違いは何ですか
$ env FOO=bar baz
そして
$ FOO=bar baz
それは何をしますかenv
?
答え1
機能的に同じです。
主な違いは、env FOO=bar baz
シェルを呼び出し、シェルbaz
とFOO=bar baz
シェルの間の中間プロセスを直接呼び出すことですbaz
。
したがって、そのような点でFOO=bar baz
好ましい。
私が使用する唯一の状況は、env FOO=bar
あるコマンドを別のコマンドに渡す必要があるときです。
具体的な例として、環境にいくつかの変更を加えてからexec
渡されたコマンドを呼び出すラッパースクリプトがあるとします。たとえば、次のようになります。
#!/bin/bash
FOO=bob
some stuff
exec "$@"
実行するとmyscript FOO=bar baz
無効であるexec
ため、エラーが発生しますexec FOO=bar baz
。代わりに、it does it
と呼ぶと完全に有効です。myscript env FOO=bar baz
exec env FOO=bar baz
答え2
baz
この特定の例では、シェルがPOSIX互換シェルであり、組み込みシェルではなく実行可能ファイルであると仮定すると、実質的な違いはありません。
あなたの殻いいえcsh
またはtcsh
構文などのPOSIX互換シェル
FOO=bar baz
動作せず、同等のシェル構文はありません。これらのシェルの場合、このenv
コマンドは単一のコマンドの環境変数をオーバーライドまたは注入する唯一の方法です。
たとえば、baz
シェル組み込みの場合、コマンドシェルで直接実行されるのではなく新しいプロセスが実行されるため、同じ結果は得られませんfc
。さらに、実行可能ファイルもなく、シェル環境と対話する方法のため、シェル組み込みでのみ実行できます。env
env
fc
env
いいえのようなものを使用してくださいfc
。
また、指定された一連の環境変数を使用して空の環境でコマンドを実行するenv
オプションも提供されます。-i
これは、env
衛生化された環境でプロセスを開始するのに役立ちます。例えば
env -i HOME=/tmp/homedir "PATH=`getconf PATH`" "TERM=$TERM" FOO=bar baz
答え3
申し上げたことに加えて
VAR=value cmd args > redirs
シェル(Bourne / POSIX)機能に渡す環境変数の名前は制限されていますcmd
。これは有効なシェル変数名でなければならず、読み取り専用またはシェルの特殊変数にすることはできません。
たとえば、次の操作はできません。
1=foo cmd
または
+++=bar cmd
bash
あなたは以下を行うことはできません:
SHELLOPTS=xtrace cmd
これを行うこともできますが:
env 1=foo cmd
env +++=bar cmd
env '=baz' cmd
(あなたがこれを望んだり望んだりする必要はありません)。または:
env SHELLOPTS=xtrace cmd
(時にはこれを行う必要があります)。
aが含まれていない(または望ましくない)環境変数文字列はenv
渡されません。=
答え4
これが本当に便利なもう1つの状況env
は、環境を完全に制御したい場合です。私はサーバープログラム(Informix、推測できない場合)を実行しており、その環境を完全に制御したいと思います。私はスクリプトを実行するためにスクリプトの最後の部分でこれを使用しますenv
。これにより、複数の変数が正しい値に設定されます。
env -i HOME="$IXD" \
INFORMIXDIR="$IXD" \
INFORMIXSERVER="$IXS" \
${IXC:+INFORMIXCONCSMCFG="$IXC"} \
${IXH:+INFORMIXSQLHOSTS="$IXH"} \
IFX_LISTEN_TIMEOUT=3 \
ONCONFIG="onconfig.$IXS" \
PATH="/bin:/usr/bin:$IXD/bin" \
SHELL=/bin/ksh \
TZ=UTC0 \
$ONINIT "$@"
この-i
オプションは既存の環境を破壊します。後続VAR=value
のオプションは、私が設定したい環境変数を設定します。プログラム名はにあり、$ONINIT
すべてのコマンドライン引数はそのまま渡されます"$@"
。
コンストラクタは、null以外の値に設定されている場合${IXH:+INFORMIXSQLHOSTS="$IXH"}
にのみ渡されますINFORMIXSQLHOSTS="$IXH"
。env
$IXH