43

command を使用して、変更された環境でシェル コマンドを呼び出そうとしていますenv

説明書によると

env HELLO='Hello World' echo $HELLO

echo する必要Hello Worldがありますが、そうではありません。私が行った場合

HELLO='Hello World' bash -c 'echo $HELLO'

期待どおりに印刷されます(この情報に対するこの回答Hello Worldのおかげです)。

ここで何が欠けていますか?

乾杯、ニクラス

4

5 に答える 5

65

これは、最初のケースでは、現在のシェル$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出力します。変数の展開はシェルのみで行われます。

于 2012-12-21T22:45:14.223 に答える
5

これは、私も戸惑ったこの状況と似ていると思います。

$HELLO簡単に言えば、最初のケースの変数展開は、その環境にない現在のシェルによって行われます。ただし、2 番目のケースでは、一重引用符によって現在のシェルが変数展開を実行できないため、すべてが期待どおりに機能します。

一重引用符を二重引用符に変更すると、このコマンドが意図したとおりに機能しなくなることに注意してください。

HELLO='Hello World' bash -c "echo $HELLO"

これは、質問の最初のコマンドと同じ理由で失敗します。

于 2012-12-21T22:41:35.417 に答える
2

これは機能し、私にとっては良いことです

$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR"
Hello World!!!
于 2016-04-18T17:23:56.047 に答える