この質問にはすでに回答があります :変数の割り当て後に同じ行でコマンドを実行することはシェルポータブルですか?
(4つの回答)
2年前に閉鎖されました。
Linux
(4つの回答)
2年前に閉鎖されました。
同僚の1人が、私がよく知らないBash構文を提供してくれました。私のGooglefooは、それが何をするのか、そしてなぜ/いつそれを使うべきなのかを理解するのに失敗しました。
彼が私に送ったコマンドは次の形式でした:
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][~]$
この構文は何をしますか?設定された変数はどうなりますか?なぜこれが機能するのですか?
承認された回答:
これは次と同等です:
( export someVariable=something; command )
これにより、someVariable
割り当てられた値を持つ環境変数。ただし、実行中のコマンドのみ。
bash
の関連部分は次のとおりです マニュアル:
簡単なコマンド
単純なコマンドは、一連のオプションの変数割り当てです。 空白で区切られた単語とリダイレクトが続き、制御オペレーターによって終了されます。最初のワードは実行するコマンドを指定し、引数ゼロとして渡されます。残りの単語は、呼び出されたコマンドに引数として渡されます。
(…)
シンプルなコマンド拡張
[コマンド拡張から]コマンド名が表示されない場合、変数の割り当ては現在のシェル環境に影響します。それ以外の場合、変数は実行されたコマンドの環境に追加され、現在のシェル環境には影響しません 。
注:これはbash
に固有のものではないことに注意してください 、ただしPOSIXで指定されています。
編集–回答のコメントからの要約されたディスカッション
BAZ=JAKE echo $BAZ
の理由 、JAKEを出力しないのは、変数の置換が何よりも先に行われるためです。変数の置換をバイパスすると、これは期待どおりに動作します:
$ echo_baz() { echo "[$BAZ]"; }
$ BAZ=Jake echo_baz
[Jake]
$ echo_baz
[]