
誰能解釋為什麼需要分號才能被LANG
bash 視為更新?
不起作用:
> LANG=Ja_JP bash -c "echo $LANG"
en_US
作品:
> LANG=Ja_JP ; bash -c "echo $LANG"
Ja_JP
我在 linux 上使用 bash 4.1.10,在 cygwin 下使用相同版本
答案1
讀取命令時進行參數和其他類型的擴展,前它被執行了。
第一個版本LANG=Ja_JP bash -c "echo $LANG"
是單一命令。在如此解析之後,$LANG
將擴展到en_US
執行任何內容之前。一旦bash
處理完輸入,它就會分叉一個進程,LANG=Ja_JP
按預期添加到環境中,然後執行bash -c echo en_US
。
您可以使用單引號(即LANG=Ja_JP bash -c 'echo $LANG'
outputs)來防止擴充Ja_JP
。
請注意,當您將變數賦值作為命令的一部分時,該賦值僅影響該命令的環境,而不會影響 shell 的環境。
第二個版本LANG=Ja_JP; bash -c "echo $LANG"
實際上是按順序執行的兩個單獨的命令。第一個是沒有指令的簡單變數賦值,因此它會影響您目前的 shell。
因此,儘管單一;
.
完全偏離主題,但我可能建議附加一個.UTF-8
when 設定LANG
.如今,在 21 世紀,沒有充分的理由不使用 Unicode。
答案2
VAR=value; somecommand
相當於
VAR=value
somecommand
這些是相繼執行的不相關命令。第一個指令為 shell 變數賦值VAR
。除非VAR
它已經是一個環境變量,否則它不會導出到環境中,而是保留在 shell 內部。聲明export VAR
將導出VAR
到環境中。
VAR=value somecommand
是不同的語法。賦值VAR=value
是給環境的,但是這個賦值只是在執行環境中進行的somecommand
,而不是為了shell後續的執行。
舉例來說:
# Assume neither VAR1 nor VAR2 is in the environment
VAR1=value
echo $VAR1 # displays "value"
env | grep '^VAR1=' # displays nothing
VAR2=value env | grep '^VAR2=' # displays "VAR2=value"
echo $VAR2 # displays nothing
答案3
這是我從研究中收集到的資訊的摘要:
有兩種類型:環境變數和 shell 變數。
在程式及其子程序/進程/子 shell 中,環境變數可用。 shell 變數僅在目前 shell 中可用。
https://askubuntu.com/a/26322/326584
首先如何echo $VAR
運作
每當終端機/shell/bash 看到 $ 符號時,它就會執行稱為「參數擴展」的操作。這意味著變數被值替換。
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
因此,如果VAR
值為“hello”,則echo $VAR
變為echo 'hello'
。
這意味著這有效......
TEST=123
echo $TEST
// 123
但以下內容不起作用,因為在命令能夠設定變數之前變數已被替換。
TEST2=999 echo $TEST2
// nothing...
但如果你加分號..
TEST2=999; echo $TEST2
它與..相同
TEST2=999
echo $TEST2
..其工作原理與以前相同。
由於 shell 變數不會傳遞給子進程/子進程,因此當您呼叫命令時它會建立一個新進程,因此...
TEST3=111
node -e 'console.log(process.env.TEST3)'
或者
TEST3=111
printenv TEST3
兩者都沒有列印任何內容。 Shell 變數不被 chld 程序繼承。使用export建立shell變量,一個環境變數..
export TEST3=111
printenv TEST3
//111
有一個例外...
VAR=123 printenv VAR
VAR=123 VAR2=456 printenv VAR2 //even multiple vars
基本上,如果像這樣編寫並在調用命令之後立即設置,那麼它只會臨時為該命令設置環境變數。它甚至沒有設定 shell var。將其視為全新的語法。
VAR=123 printenv VAR // 123
echo $VAR // nothing
VAR=123
echo $VAR // 123