[英]strange behavior of 'echo' in 'env' bash
當我在'env'命令中嘗試echo變量時,什么也沒得到,但是我可以使用'printenv'命令看到它:
root@devel:~# env xxx=23 echo $xxx
root@devel:~# env xxx=23 printenv | grep xxx
xxx=23
怎么了
env xxx=23 echo $xxx
在上面,shell在執行env
之前評估$xxx
。 因此,沒有回聲。
更詳細地講,外殼程序會看到四個單詞env
, xxx=23
, echo
和$xxx
。 它將env
解釋為命令名稱,並將xxx=23
, echo
和$xxx
為三個參數,這些參數將傳遞給命令env
。 在將$xxx
傳遞給命令env
之前,它會求值。
相比之下,在下文中,沒有要評估的Shell變量。 而是用兩個參數xxx=23
和printenv
執行env
。 env
設置環境變量xxx
,然后執行printenv
:
$ env xxx=23 printenv | grep xxx
xxx=23
同樣,請注意:
$ env xxx=23 sh -c 'echo $xxx'
23
由於$xxx
在單引號內,因此外殼程序不會對其進行評估。 而是使用四個參數運行env
: xxx=23
, sh
, -c
和echo $xxx
。 env
設置環境變量xxx
,它將使用參數-c
執行sh
並echo $xxx
。 $xxx
sh
在執行sh
時被求值,因此它看到變量xxx
。
當您運行env xxx=23 echo $xxx
,變量xxx=23
在執行過程中對echo
過程可見。 但在echo $xxx
價值$xxx
不會被評估echo
,它是由當前正在執行的外殼進行評估。 而且由於env ...
調用不會影響當前的shell,因此$xxx
的值與執行此命令之前的值相同(可能未設置)。
echo
不是測試env
效果的好方法,因為您不能使echo
命令打印在其環境中定義的特定值。 使用printenv
示例更好,因為它轉儲了它所知道的環境變量的內容。 另一個好的測試是@john在他的答案中寫的內容,它調用另一個shell並使該shell打印一個選定的環境變量。 任何能夠打印環境變量內容的程序都可以使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.