このシェル/ Bashの構文は何ですか:someVariable = someValue someCommand [重複]

このシェル/ Bashの構文は何ですか:someVariable = someValue someCommand [重複]

私の同僚が私に慣れていない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 $BAZJAKEが印刷されない理由は、変数置換が他のものよりも先に行われるためです。変数置換をバイパスすると、期待どおりに機能します。

$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]

おすすめ記事