如何在输出将通过管道传输的函数上在bash上设置环境变量?

时间:2014-03-12 01:19:36

标签: bash function environment-variables pipe

我有一个类似于以下

的bash脚本
func() {
  echo "func was called"
  var="right"
}

var="wrong"
func
echo $var

var="wrong"
func | tee file
echo $var

由于func()将var设置为“right”,我希望echo能够将该字符串打印两次。但是,我注意到如果函数的输出通过管道重定向(而不是通过使用>的文件),则不会设置环境变量。在这种情况下,输出是

right
func was called
wrong

为什么会这样?有没有办法让我的函数设置环境变量,即使它的输出被重定向?

2 个答案:

答案 0 :(得分:2)

如果在管道中运行命令(即由|分隔的一系列简单命令),则命令实际上在子shell中执行。由于每个shell都有自己的环境变量,并且不同shell中的变量之间没有关系,因此您不能在管道中运行的命令(管道的任一侧)中保留环境变量。

在许多情况下,您可以使用process substitution解决此问题。例如:

func > >(tee file)

答案 1 :(得分:1)

由于在tee命令之前使用管道而发生了这种情况,该命令创建了一个子shell来执行命令。您在子shell本身中对变量值进行了更改,当子shell退出时,您在父调用shell中获得未更改的值。