当通过管道导出到另一个命令(使用 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