Bash:可以记录影响变量范围吗?

问题描述:

在我当前的项目中,我运行一个循环,在执行过程中定义了一个稍后需要的变量。 一切都运行良好,直到我想添加与三通记录,以便我以后可以检查日志还在一个文件中。 由于我想记录stdout和stderr,我申请了|&2>&1 |的快捷方式)。 但奇怪的是,变量的值会丢失。Bash:可以记录影响变量范围吗?

for i in 1 2 3 ; do 
    # ... do something meaningful ... 
    myVar=test1 
done |& tee test1 
echo "myVar=$myVar" 

输出:

myVar= 

同时我发现了一个方法,那效果更好:当我切换到文件重定向进程替换,变量定义作品的组合。

for i in 1 2 3 ; do 
    # ... do something meaningful ... 
    myVar=test2 
done > >(tee test2 ) \ 
    2> >(tee test2 >&2) 
echo "myVar=$myVar" 

输出:

myVar=foo 

但我想明白了,为什么:-)

  1. 为什么价值迷失在第一个例子吗?
  2. 为什么不在第二个迷失?

你能告诉吗?

+1

使用管道在管道的任一侧创建一个子壳体,当它结束时,两端都会关闭而失去内部环境。它无关三通,与任何命令试试。第二种方法仅适用于'>()'所以什么也没在那里不丢失创建一个子shell。 – 123

As 123 said管道创建一个子壳(新范围)和副壳具有与母体壳的变量没有访问。

以下的辅助函数示出了外壳的PID和可变a的值。

show_a() { echo $BASHPID: a=$a >&2; } 

以下示例不创建子shell,因为只使用重定向。只使用一个变量a

$ a=1; show_a; { a=2; show_a; } > /dev/null ; show_a 
31072: a=1 
31072: a=2 
31072: a=2 

但是这个例子创建了一个子shell,因为管道。并且每个过程都有自己的变量a

$ a=1; show_a; { a=2; show_a; } | tee ; show_a 
31072: a=1 
6375: a=2 
31072: a=1 
+0

明白了!谢谢你们俩。尼斯把戏执行过程中打印$ BASHPID。 – Hardy