これは、最初のケースでは、現在のシェル$HELLO
がコマンドを実行する前に変数を展開するためです。またHELLO
、現在のシェルには変数が設定されていません。
env HELLO='Hello World' echo $HELLO
これを行います:
- この場合、指定された変数を展開します
$HELLO
'HELLO=Hello World'
3 つの引数, 'echo'
and (現在のシェルには変数が設定されてい''
ないため、空の文字列)を指定して env を実行します 。HELLO
env
コマンドが実行され、その環境で が設定されHELLO='Hello World'
ます
env
echo
引数''
(空の文字列)で実行されます
ご覧のとおり、現在のシェルは$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
出力します。変数の展開はシェルのみで行われます。