これは、最初のケースでは、現在のシェル$HELLOがコマンドを実行する前に変数を展開するためです。またHELLO、現在のシェルには変数が設定されていません。
env HELLO='Hello World' echo $HELLO
これを行います:
- この場合、指定された変数を展開します
$HELLO
'HELLO=Hello World'3 つの引数, 'echo'and (現在のシェルには変数が設定されてい''ないため、空の文字列)を指定して env を実行します 。HELLO
envコマンドが実行され、その環境で が設定されHELLO='Hello World'ます
envecho引数''(空の文字列)で実行されます
ご覧のとおり、現在のシェルは$HELLO変数を展開しましたが、設定されていません。
HELLO='Hello World' bash -c 'echo $HELLO'
これを行います:
HELLO='Hello World次のコマンドの変数を設定します
'-c'2 つの引数を指定して bash を実行し、'echo $HELLO'
- 最後の引数は一重引用符で囲まれているため、その中は何も展開されません
- 次に新しいbashがコマンドを実行します
echo $HELLO
$HELLO新しい bash サブシェルでecho を実行するために、bash は最初に可能なものをすべて展開します ($HELLOこの場合は、親シェルがそれを設定します) Hello World。
- サブシェルが実行されます
echo 'Hello World'
たとえば、これをやろうとした場合:
env HELLO='Hello World' echo '$HELLO'
- 現在のシェルは
$HELLO、単一引用符で囲まれているため、可能な限り展開します。
- 3 つの引数を指定して env を実行し
'HELLO=Hello World'、'echo''$HELLO'
- env コマンドが実行され
HELLO='Hello World'、その環境に が設定されます
- env は、引数を指定して echo を実行します
'$HELLO'
この場合、 を展開するシェルがない$HELLOためecho、文字列を受け取って$HELLO出力します。変数の展開はシェルのみで行われます。