env
コマンドを使用して、環境を変更したシェルコマンドを起動しようとしています。
マニュアルによると
env HELLO='Hello World' echo $HELLO
Hello World
、しかしそうではありません。私が行った場合
HELLO='Hello World' bash -c 'echo $HELLO'
Hello World
期待どおり(この情報について この回答 に感謝)。
ここで何が欠けていますか?
乾杯、ニクラス
最初のケースでは、現在のシェルがコマンドを実行する前に$ HELLO変数を展開するためです。また、現在のシェルにはHELLO変数が設定されていません。
env HELLO='Hello World' echo $HELLO
これを行います:
ご覧のように、現在のシェルは$ HELLO変数を拡張しましたが、これは設定されていません。
HELLO='Hello World' bash -c 'echo $HELLO'
これを行います:
HELLO='Hello World
を次のコマンドに設定しますecho $HELLO
コマンドを実行しますあなたがやろうとした場合この:
env HELLO='Hello World' echo '$HELLO'
この場合、$ HELLOを展開するシェルはないため、echoは文字列$HELLO
を受け取り、それを出力します。変数の展開は、シェルによってのみ行われます。
何が起こるかは、私も困惑した この状況 に似ていると思います。
簡単に言えば、最初のケースでの変数の展開は、その環境に$HELLO
がない現在のシェルによって行われます。ただし、2番目のケースでは、単一引用符によって現在のシェルが変数を展開できないため、すべてが期待どおりに機能します。
一重引用符を二重引用符に変更すると、このコマンドが希望どおりに機能しなくなることに注意してください。
HELLO='Hello World' bash -c "echo $HELLO"
これは、質問の最初のコマンドと同じ理由で失敗します。
これは機能し、私にとっては良いことです
$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR"
Hello World!!!
シェルが期待どおりに機能していることを確認する簡単な方法を次に示します。
env A=42 env
env
最初のコマンドを実行すると、A
が42に設定され、env
が実行されます。 2番目のコマンドは、runs env
も実行します。両方の出力を比較します。