导出将变量传递给其他命令时不设置变量

导出将变量传递给其他命令时不设置变量

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

相关内容