何時在環境變數和命令之間使用分號

何時在環境變數和命令之間使用分號

誰能解釋為什麼需要分號才能被LANGbash 視為更新?

不起作用:

> 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-8when 設定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

相關內容