當透過管道匯出到另一個命令(使用 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