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

如何在输出将通过管道传输的函数的bash上设置环境变量?,bash,function,environment-variables,pipe,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 call

我有一个类似于下面的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

为什么会这样?是否有任何方法可以让该函数设置环境变量,即使其输出被重定向?

这是由于使用了pipe-before
tee
命令,该命令创建了一个子shell来执行命令。您在子shell本身中更改变量值,当子shell退出时,在父调用shell中获得未更改的值。

这是由于使用了pipe-before
tee
命令,该命令创建子shell以执行命令。您在子shell本身中更改变量值,当子shell退出时,在父调用shell中获得未更改的值。

这是由于使用了pipe-before
tee
命令,该命令创建子shell以执行命令。您在子shell本身中更改变量值,当子shell退出时,在父调用shell中获得未更改的值。

这是由于使用了pipe-before
tee
命令,该命令创建子shell以执行命令。您在子shell本身中更改变量值,当子shell退出时,您在父调用shell中获得未更改的值。

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

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

func > >(tee file)

如果在管道中运行命令(即,由
|
分隔的一系列简单命令),那么该命令实际上是在子shell中执行的。由于每个shell都有自己的环境变量,并且不同shell中的变量之间没有关系,所以不能通过管道中运行的命令(在管道的任一侧)持久化环境变量

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

func > >(tee file)

如果在管道中运行命令(即,由
|
分隔的一系列简单命令),那么该命令实际上是在子shell中执行的。由于每个shell都有自己的环境变量,并且不同shell中的变量之间没有关系,所以不能通过管道中运行的命令(在管道的任一侧)持久化环境变量

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

func > >(tee file)

如果在管道中运行命令(即,由
|
分隔的一系列简单命令),那么该命令实际上是在子shell中执行的。由于每个shell都有自己的环境变量,并且不同shell中的变量之间没有关系,所以不能通过管道中运行的命令(在管道的任一侧)持久化环境变量

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

func > >(tee file)