envコマンドは正確にどのように機能しますか?

envコマンドは正確にどのように機能しますか?

私は初めて環境変数に触れ、環境変数をスクリプトに渡して再定義する方法をテストしています。

動作をテストするために、testenv.sh次の名前の簡単なスクリプトを作成しました。

#!/bin/bash
echo $COLOR

だから私が走るとき

$ env COLOR=RED ./testenv.sh

予想されるstdoutを取得しますRED


しかし、私の質問は、次のコマンドを実行する理由です。

$ env COLOR=RED echo $COLOR

上記のような結果は得られません。実際には空の標準出力です。

答え1

$COLORenv呼び出される前にシェルによって拡張されます/bin/echo

env変数を拡張するシェルスクリプトを呼び出さないと動作しません。

でも:

COLOR=RED echo $COLOR

新しい環境を設定する前にシェル変数を拡張するため、期待どおりに機能しません。

2行に分ける必要があります。

COLOR=RED
echo $COLOR

期待どおりに動作するようにしてください。

電話する場合:

env COLOR=RED sh -c 'echo $COLOR'

これは、単一引用符が変数の拡張を防ぎ、新しい環境で新しいシェルが実行されると変数の拡張が遅れるために機能します。

関連情報