導出將變數傳遞給其他命令時不設定變數

導出將變數傳遞給其他命令時不設定變數

當透過管道匯出到另一個命令(使用 bash 3.2)時,變數不會更改。

export USER=new | cat ; env | grep USER

輸出:USER=old

User 變數不會更改並保持不變。但導出成功退出:export USER=new | echo $?輸出0。

答案1

通常,管道的各個部分(某些 shell 中的最後一個部分除外)在子 shell 中運行,即 shell 為每個部分創建一個自身的副本,然後每個副本處理該部分中的命令並執行任何外部命令(就像cat那裡一樣)。繼續執行下一個命令(另一個管道)的主 shell 不會看到更改的值。

(無論如何,您期望var在像這樣的命令之後應該出現什麼值var=foo | var=bar?)

通常,當您在管道的最後一部分進行變數分配時,就會出現這種情況,例如

n=0
some command | while read line; do n=$((n+1)); done

在許多 shell 中,這將保留n設置0,但不是在所有 shell 中:ksh 和 zsh 運行主 shell 中的最後一部分,Bash 有一個選項。這在中討論為什麼我的變數在一個「while read」迴圈中是本地變量,但在另一個看似相似的循環中卻不是?

答案2

按如下方式重寫程式碼:

export USER=new
env | grep $USER

USER要取得之前需要的變數內容$。並且管道打開export毫無意義,因為export命令沒有任何輸出到 STDOUT

相關內容