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 -c
do ...
x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable
資源
答案1
這條線
x=123 echo $x
按以下順序評估:
$x
被擴展為 的x
值目前的殼。x
將要執行的命令的環境中的值設定為123- 在擴展的命令列中搜尋命令並
echo
找到。 echo
x
在設定為 123 的環境中運行,並$1
設定為x
步驟 1 中的任何值。echo
輸出$1
到標準輸出,但忽略其環境中的其他值。
請注意,$x
作為參數與x
命令之前的參數是分開的。