1. ホーム
  2. bash

[解決済み] 環境変数の指定とエコーを同じコマンドラインで実行できないのはなぜですか?

2022-12-01 05:14:40

質問

このスニペットを考えてみましょう。

$ SOMEVAR=AAA
$ echo zzz $SOMEVAR zzz
zzz AAA zzz

ここでは $SOMEVARAAA に変更し、2 行目でそれを echo したら、次のようになります。 AAA の内容が期待通りに表示されます。

しかし、その後に、同じコマンドラインで変数を指定しようとすると echo :

$ SOMEVAR=BBB echo zzz $SOMEVAR zzz
zzz AAA zzz

... 私は BBB は表示されず、古い値 ( AAA ).

こんな感じでいいんでしょうか?もしそうだとしたら、どうしてこうして LD_PRELOAD=/... program args ... のように変数を指定すると、うまくいくのでしょうか?私は何を見逃しているのでしょうか?

どのように解決するのですか?

あなたが見たものは、期待された動作です。 問題は、親シェルが $SOMEVAR を評価することです。 あなたは $SOMEVAR の評価を環境が設定された後まで延期させる必要があります。

当面のオプションは以下の通りです。

  1. SOMEVAR=BBB eval echo zzz '$SOMEVAR' zzz .
  2. SOMEVAR=BBB sh -c 'echo zzz $SOMEVAR zzz' .

これらは両方ともシングルクォートを使って、親シェルが評価するのを防ぎます。 $SOMEVAR が環境に設定された後にのみ評価されます (一時的に、単一コマンドの間だけ)。

もう一つの選択肢は、サブシェル表記を使うことです (これもまた Marcus Kuhn が提案したものです。 回答 ):

(SOMEVAR=BBB; echo zzz $SOMEVAR zzz)

変数はサブシェルにのみ設定される