Bash

這個 shell/Bash 語法是什麼: someVariable=someValue someCommand

  • July 4, 2019

我的一位同事向我提供了一種我不熟悉的 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
[]

引用自:https://unix.stackexchange.com/questions/334578