我正在开发一个流水线,其中有几个分支点,后来会合并-- 它们看起来像这样:
command2
/ \
command1 command4
\ /
command3
每个命令都会通过标准输出(STDOUT)进行写入,并通过标准输入(STDIN)接受输入。需要将command1的STDOUT传递给两个按顺序运行的命令command2和command3,它们的输出需要被有效地连接并传递给command4。我最初认为类似这样的命令可以工作:
$ command1 | (command2; command3) | command4
但是这并不起作用,因为只有来自command2的STDOUT被传递到command4,当我移除command4时,很明显command3没有从command1接收到适当的流——换句话说,就好像command2正在耗尽或消耗流。当我在中间使用{command2; command3;}时,也会得到相同的结果。所以我想我应该使用带有进程替换的'tee',于是我尝试了以下内容:
$ command1 | tee >(command2) | command3 | command4
但令人惊讶的是,那也不起作用——看起来command1的输出 和 command2的输出都被导入了command3,这就导致错误并且只有command3的输出被导入了command4。我发现以下内容可以正确地将输入和输出传递给command2和command3:
$ command1 | tee >(command2) >(command3) | command4
然而,这样会将command1的输出流传输到command4中,导致问题,因为command2和command3产生的规范与command1不同。我想到的解决方案似乎有些狡猾,但它确实有效:
$ command1 | tee >(command2) >(command3) > /dev/null | command4
这会阻止command1将其输出传递给command4,同时收集来自command2和command3的标准输出。虽然它能够工作,但我感觉可能有更明显的解决方案。我错了吗?我已经阅读了数十个线程,并没有找到在我的使用情况下有效的解决方法,也没有看到关于分割和重新连接流的确切问题的详细说明(尽管我不可能是第一个处理此问题的人)。我应该只使用命名管道吗?我尝试过,但难以使其正常工作,所以也许这是另一个帖子的另一个故事。我在RHEL5.8中使用bash。