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
但我想明白了,为什么:-)
- 为什么价值迷失在第一个例子吗?
- 为什么不在第二个迷失?
你能告诉吗?
答
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
使用管道在管道的任一侧创建一个子壳体,当它结束时,两端都会关闭而失去内部环境。它无关三通,与任何命令试试。第二种方法仅适用于'>()'所以什么也没在那里不丢失创建一个子shell。 – 123