Bash
這個 shell/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][~]$
這個語法有什麼作用?已設置的變數會發生什麼?為什麼這行得通?
這相當於:
( export someVariable=something; command )
這會
someVariable
生成一個環境變數,具有分配的值,但僅適用於正在執行的命令。以下是
bash
手冊的相關部分:簡單命令
一個簡單的命令是一系列可選的變數賦值,後跟空格分隔的單詞和重定向,並由控制操作符終止。第一個字指定要執行的命令,並作為參數零傳遞。剩餘的單詞作為參數傳遞給呼叫的命令。
(…)
簡單的命令擴展
如果沒有命令名稱結果
$$ from command expansion $$,變數賦值會影響目前的 shell 環境。否則,變數會被添加到執行命令的環境中,並且不會影響目前的 shell 環境。
注意:請記住,這不是特定於
bash
,而是由 POSIX 指定的。編輯 - 從答案中的評論總結討論
不列印 JAKE的原因
BAZ=JAKE echo $BAZ
是因為變數替換是在其他任何事情之前完成的。如果您繞過變數替換,這將按預期執行:$ echo_baz() { echo "[$BAZ]"; } $ BAZ=Jake echo_baz [Jake] $ echo_baz []