簡體   English   中英

“ env” bash中“ echo”的奇怪行為

[英]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 因此,沒有回聲。

更詳細地講,外殼程序會看到四個單詞envxxx=23echo$xxx 它將env解釋為命令名稱,並將xxx=23echo$xxx為三個參數,這些參數將傳遞給命令env $xxx傳遞給命令env 之前,它會求值。

相比之下,在下文中,沒有要評估的Shell變量。 而是用兩個參數xxx=23printenv執行env env設置環境變量xxx ,然后執行printenv

$ env xxx=23 printenv | grep xxx
xxx=23

同樣,請注意:

$ env xxx=23 sh -c 'echo $xxx'
23

由於$xxx在單引號內,因此外殼程序不會對其進行評估。 而是使用四個參數運行envxxx=23sh-cecho $xxx env設置環境變量xxx ,它將使用參數-c執行shecho $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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM