環境または環境なし

環境または環境なし

コマンドの違いは何ですか

$ env FOO=bar baz

そして

$ FOO=bar baz

それは何をしますかenv

答え1

機能的に同じです。

主な違いは、env FOO=bar bazシェルを呼び出し、シェルbazFOO=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 bazexec env FOO=bar baz

答え2

bazこの特定の例では、シェルがPOSIX互換シェルであり、組み込みシェルではなく実行可能ファイルであると仮定すると、実質的な違いはありません。

あなたの殻いいえcshまたはtcsh構文などのPOSIX互換シェル

FOO=bar baz

動作せず、同等のシェル構文はありません。これらのシェルの場合、このenvコマンドは単一のコマンドの環境変数をオーバーライドまたは注入する唯一の方法です。

たとえば、bazシェル組み込みの場合、コマンドシェルで直接実行されるのではなく新しいプロセスが実行されるため、同じ結果は得られませんfc。さらに、実行可能ファイルもなく、シェル環境と対話する方法のため、シェル組み込みでのみ実行できます。envenvfcenvいいえのようなものを使用してください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

関連情報