為什麼命令前面的變數賦值被忽略?

為什麼命令前面的變數賦值被忽略?

bash 4.1 線上說明頁指出(強調已添加)

簡單指令

一個簡單的指令是一系列可選變數賦值,後面跟著空格分隔的單字和重定向,並由控制操作員終止。首先單字指定要執行的命令,並作為參數零傳遞。其餘單字作為參數傳遞給呼叫的命令。

驗證我的系統上的版本(未針對砲彈休克修補)

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

然而,前面的變數賦值(不帶分號)應該是一種僅在該命令調用的生命週期內本地化環境變數值的方法,但似乎不是...

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

解決方案
這個答案來自另一個問題看來該命令必須故意使用其父級的環境變量,但echo事實並非如此。但是 shell 呼叫就像bash -cdo ...

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

資源

答案1

這條線

x=123 echo $x

按以下順序評估:

  1. $x被擴展為 的x目前的殼。
  2. x將要執行的命令的環境中的值設定為123
  3. 在擴展的命令列中搜尋命令並echo找到。
  4. echox在設定為 123 的環境中運行,並$1設定為x步驟 1 中的任何值。
  5. echo輸出$1到標準輸出,但忽略其環境中的其他值。

請注意,$x作為參數與x命令之前的參數是分開的。

相關內容