加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何从多个进程中拆分和重新加入STDOUT?

发布时间:2020-12-16 01:18:47 所属栏目:安全 来源:网络整理
导读:我正在开发一个管道,它有一些随后合并的分支点 – 它们看起来像这样: command2 / command1 command4 / command3 每个命令都写入STDOUT并通过STDIN接受输入.来自command1的STDOUT需要传递给command2和command3,它们按顺序运行,并且它们的输出需要有效地连
我正在开发一个管道,它有一些随后合并的分支点 – 它们看起来像这样:
command2
        /        
command1          command4
                /
         command3

每个命令都写入STDOUT并通过STDIN接受输入.来自command1的STDOUT需要传递给command2和command3,它们按顺序运行,并且它们的输出需要有效地连接并传递给command4.我最初认为像这样的东西会起作用:

$command1 | (command2; command3) | command4

这不起作用,因为只有来自command2的STDOUT传递给命令4,当我删除command4时,很明显command3没有从command1传递适当的流 – 换句话说,就好像command2正在耗尽或消耗流.我用{command2;得到了相同的结果command3;在中间也是如此.所以我想我应该使用‘tee’ with process substitution,并试过这个:

$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收集STDOUT.它有效,但我觉得我错过了一个更明显的解决方案.我呢?我已经阅读了几十个主题并且没有找到解决这个问题的解决方案,这个问题在我的用例中起作用,也没有看到详细解决拆分和重新加入流的问题(尽管我不能成为第一个一个来处理这个).我应该只使用命名管道吗?我试过但很难让它工作,所以也许这是另一个故事的另一个故事.我在RHEL5.8中使用bash.

你可以玩这样的文件描述符;
((date | tee >( wc >&3) | wc) 3>&1) | wc

要么

((command1 | tee >( command2 >&3) | command3) 3>&1) | command4

为了解释,即tee>(wc>& 3)将在stdout上输出原始数据,并且内部wc将在FD 3上输出结果.外部3>& 1)然后将FD3输出合并回来进入STDOUT,因此两个wc的输出都被发送到拖尾命令.

但是,此管道(或您自己的解决方案中的那个)中没有任何内容可以保证输出不会被破坏.这是来自command2的不完整的行不会与command3的行混淆 – 如果这是一个问题,你将需要做两件事之一;

>编写自己的tee程序,在内部使用popen并在将完整行发送到stdout之前读取每一行,以便command4读取>将command2和command3的输出写入文件,并使用cat将数据合并为command4的输入

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读