将一个命令的STDOUT同时传递给多个程序(bash)

将一个命令的STDOUT同时传递给多个程序(bash),bash,pipe,process-substitution,Bash,Pipe,Process Substitution,在bash中,一个命令的stdout可以使用以下模板一次通过管道传输到多个程序中: echo 'foobar' | tee >(command1) >(command2) | command3 因此,你可以: echo "the fox jumped over the lazy dog" | tee >(grep fox) >(grep jumped) 并获取所有三个命令的输出 现在我尝试存储所有这些命令的输出,但没有成功: echo "the fox jumped

在bash中,一个命令的stdout可以使用以下模板一次通过管道传输到多个程序中:

echo 'foobar' | tee >(command1) >(command2) | command3
因此,你可以:

echo "the fox jumped over the lazy dog" | tee >(grep fox) >(grep jumped)
并获取所有三个命令的输出

现在我尝试存储所有这些命令的输出,但没有成功:

echo "the fox jumped over the lazy dog" | tee >(n1=$(grep fox)) >(n2=$(grep jumped))
echo $n1, $n2
您将看到
$n1
$n2
为空!为什么?有没有办法让这一切顺利进行


谢谢。

原因与以下输出的
条码相同:

$ foo=bar
$ $(foo=quux)
$ echo $foo
bar

子shell中的赋值(或在您的情况下完全独立的进程)不会在父shell(或完全无关的)中进行更改。

谢谢@EtanReisner。那么,解决我的问题的“正确方法”是什么呢?如果您需要将相同的输出发送到多个命令,并在同一shell会话中保存它们的所有输出,那么您将需要保存来自该命令的输出,并手动将其重复到其他命令<代码>输出=$(第一个命令);n1=$(回显“$out”|第二个命令);n2=$(回显“$out”|第三个命令)。。。“$n1”“$n2”
。您知道我可以在文档中的什么地方读到有关父和子shell以及它们之间传递的内容吗?bash手册页的
命令执行环境
部分对此进行了一些讨论。但通常情况下,子shell从父shell知道大多数事情,而父shell什么都不知道(除了子shell的输出和可能的返回代码)。由于您使用的是
grep
-ing单行,因此n1和n2的值是相同的。这是有意的吗?解决这个问题的方法是: