私の同僚が私に慣れていないBashの構文を提供しました。私のGoogle fooはそれが何をするのか、なぜ/いつ使うべきかを知りませんでした。
彼が私に送った命令はこうだった。
someVariable=something command
最初、私はこれが次のように思った。
someVariable=something ; command
または
someVariable=something
command
しかし、それは本当ではないようです。例:
[Jan-03 11:26][~]$ # Look at the environment variable BAZ. It is currently empty
[Jan-03 11:26][~]$ echo $BAZ
[Jan-03 11:27][~]$ # Try running a command of the same format
[Jan-03 11:27][~]$ BAZ=jake echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:27][~]$ # Now, echo BAZ again. It is still empty:
[Jan-03 11:27][~]$ echo $BAZ
[Jan-03 11:27][~]$
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # If we add a semi-colon to the command, we get dramatically different results:
[Jan-03 11:28][~]$ BAZ=jake ; echo $BAZ
jake
[Jan-03 11:28][~]$
[Jan-03 11:28][~]$ # And we can see that the variable is actually set:
[Jan-03 11:29][~]$ echo $BAZ
jake
[Jan-03 11:29][~]$
この構文の機能は何ですか?設定された変数はどうなりますか?これがうまくいくのはなぜですか?
ベストアンサー1
これは次のとおりです。
( export someVariable=something; command )
someVariable
これにより、指定された値を使用して環境変数が生成されますが、実行中のコマンドに対してのみ生成されます。
マニュアルの関連部分は次のとおりですbash
。
簡単なコマンド
簡単なコマンドは順序ですオプションの変数割り当てスペースで区切られた単語とリダイレクトが続き、制御演算子で終了します。最初の単語は実行するコマンドを指定し、引数0に渡されます。残りの単語は、呼び出されたコマンドに引数として渡されます。
(...)
簡単なコマンド拡張
[コマンド拡張] このコマンド名を生成しない場合、変数の割り当ては現在のシェル環境に影響します。そうでなければ、コマンドが実行される環境に変数が追加され、現在のシェル環境には影響しません。。
注:これは限定されませbash
んが、POSIXで指定。
編集 - 回答のコメントでの議論のまとめ
BAZ=JAKE echo $BAZ
JAKEが印刷されない理由は、変数置換が他のものよりも先に行われるためです。変数置換をバイパスすると、期待どおりに機能します。
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]