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