コマンドの前の変数割り当てが無視されるのはなぜですか?

コマンドの前の変数割り当てが無視されるのはなぜですか?

bash 4.1のマニュアルページには次のように記されている。(強調追加)...

シンプルなコマンド

簡単なコマンドは一連のオプションの変数割り当てと、それに続く空白で区切られた単語リダイレクトと制御演算子で終了する。最初の言葉実行するコマンドを指定し、引数 0 として渡されます。残りの単語は、呼び出されたコマンドに引数として渡されます。

システムのバージョンを確認する(シェルショックのパッチは適用されていません)...

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

ただし、セミコロンなしで先行する変数割り当ては、そのコマンド呼び出しの有効期間のみ環境変数の値をローカライズする方法であるはずですが、そうではないようです...

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

解決
パー別の質問からのこの回答コマンドは意図的に親の環境変数を使用する必要があるようですが、echoそうではありません。ただし、次のようなシェル呼び出しはbash -c...

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

リソース

答え1

この行

x=123 echo $x

次の順序で評価されます。

  1. $xx現在シェル。
  2. x実行されるコマンドの環境の値は123に設定されます
  3. 展開されたコマンドラインでコマンドが検索され、echo見つかります。
  4. echoが 123 に設定されている環境で実行されx、手順 1 で設定$1された値に設定されます。x
  5. echo標準出力に出力します$1が、環境内の他の値は無視します。

$x引数は、xコマンドの前にあるとは別のものであることに注意してください。

関連情報