【问题标题】:pipe STDOUT of a command to several programs at once (bash)一次将命令的 STDOUT 管道传输到多个程序(bash)
【发布时间】:2014-07-28 18:07:59
【问题描述】:

根据 bash 中的process substitution,一个命令的标准输出可以使用以下模板一次通过管道传输到多个程序中:

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 是空的!为什么?有没有办法让这个工作?

谢谢。

【问题讨论】:

标签: bash pipe process-substitution


【解决方案1】:

出于同样的原因,以下输出bar

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

子外壳(或在您的情况下完全独立的进程)中的分配不会在父外壳(或完全不相关的外壳)中进行更改。

【讨论】:

  • 感谢@EtanReisner。那么解决我的问题的“正确方法”是什么?
  • 如果您需要将相同的输出发送到多个命令并将其所有输出保存在同一个 shell 会话中,那么您将需要保存命令的输出并手动重复每个命令. out=$(first command); n1=$(echo "$out" | second-command); n2=$(echo "$out" | third-command); ... "$n1" "$n2".
  • 你知道我可以在文档中的哪里读到关于父壳和子壳以及它们之间传递的内容吗?
  • bash 手册页的Command Execution Environment 部分对此进行了一些讨论。但一般来说,子 shell 知道来自父 shell 的大部分内容,而父 shell 什么都不知道(除了子 shell 的输出和可能的返回代码)。
猜你喜欢
  • 1970-01-01
  • 2012-08-08
  • 2017-05-22
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多