我有一个类似于以下
的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
为什么会这样?有没有办法让我的函数设置环境变量,即使它的输出被重定向?
答案 0 :(得分:2)
如果在管道中运行命令(即由|
分隔的一系列简单命令),则命令实际上在子shell中执行。由于每个shell都有自己的环境变量,并且不同shell中的变量之间没有关系,因此您不能在管道中运行的命令(管道的任一侧)中保留环境变量。
在许多情况下,您可以使用process substitution解决此问题。例如:
func > >(tee file)
答案 1 :(得分:1)
由于在tee
命令之前使用管道而发生了这种情况,该命令创建了一个子shell来执行命令。您在子shell本身中对变量值进行了更改,当子shell退出时,您在父调用shell中获得未更改的值。