bash管道阻止全局变量赋值

时间:2011-06-06 16:47:08

标签: bash variables pipe

unset v
function f {
  v=1
}
f | cat
echo v=$v
f 
echo v=$v

为什么管道(对任何命令)阻止第一个echo命令打印1?第二个echo打印1.我正在使用bash shell。我可以通过复制/粘贴或将其作为脚本运行来查看。

1 个答案:

答案 0 :(得分:9)

管道的所有组件(如果多于一个)都在子shell中执行,并且它们的变量赋值不会持久存储到主shell中。

原因是bash不支持真正的多线程(并发访问变量),只支持并行运行的子进程。


如何避免此

您必须在 bash过程中执行任何要保留的变量赋值(或找到某种方法将它们传输到那里)。执行此操作的bash方法不是使用管道,而是使用进程替换:

f > >( cat )

当然,如果您需要在管道的两个进程中执行变量赋值,这将无济于事。那么你必须考虑一个更好的机制(也许是coprocesses,并在某处输出变量?)