unset v
function f {
v=1
}
f | cat
echo v=$v
f
echo v=$v
为什么管道(对任何命令)阻止第一个echo命令打印1?第二个echo打印1.我正在使用bash shell。我可以通过复制/粘贴或将其作为脚本运行来查看。
答案 0 :(得分:9)
管道的所有组件(如果多于一个)都在子shell中执行,并且它们的变量赋值不会持久存储到主shell中。
原因是bash不支持真正的多线程(并发访问变量),只支持并行运行的子进程。
如何避免此:
您必须在主 bash过程中执行任何要保留的变量赋值(或找到某种方法将它们传输到那里)。执行此操作的bash方法不是使用管道,而是使用进程替换:
f > >( cat )
当然,如果您需要在管道的两个进程中执行变量赋值,这将无济于事。那么你必须考虑一个更好的机制(也许是coprocesses,并在某处输出变量?)