![コマンド前の変数の割り当てが無視されるのはなぜですか? [コピー]](https://linux33.com/image/57308/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%89%8D%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%AE%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%81%8C%E7%84%A1%E8%A6%96%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
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
次の順序で評価されます。
$x
x
値が拡張されました現在のシェル。x
実行する命令環境の値を123に設定- 拡張コマンドラインでコマンドを検索して
echo
検索します。 echo
x
123に設定された環境で実行し、手順1で設定した値$1
に設定します。x
echo
$1
標準出力に出力しますが、その環境の他の値は無視します。
$x
引数はx
コマンドの前の引数とは別のものであることに注意してください。