将两个并发程序的输出与bash组合
发布时间:2020-12-15 18:51:33 所属栏目:安全 来源:网络整理
导读:我想从两个并发程序(日志文件尾)捕获输出到bash中的一个输出流. 我用这个示例程序进行测试: function foo { for i in $(seq 1 10); do echo "program $*"; sleep 1; done } 现在以下工作正常 (foo bar foo baz ) | tee /tmp/output 但是一旦我在混合中添加
我想从两个并发程序(日志文件尾)捕获输出到bash中的一个输出流.
我用这个示例程序进行测试: function foo { for i in $(seq 1 10); do echo "program $*"; sleep 1; done } 现在以下工作正常 (foo bar & foo baz &) | tee /tmp/output 但是一旦我在混合中添加了一个额外的管道,它不再有效: (foo bar | grep bar & foo baz &) | tee /tmp/output # does't work 输出顺序.我可以制作一个单独的程序,包括grep,但我想知道是否有办法. 如果有人可以解释为什么它不工作,我会很开心.
很好的问题!这一个让我有点困惑,但我想我知道发生了什么.正在发生的是grep正在缓冲输出.所以,如果你让它运行,你会看到一切洪水到最后.如果你碰巧使用GNU grep,尝试传递–line-buffered选项:
(foo bar | grep --line-buffered bar & foo baz &) | tee /tmp/output 为了危害一个猜测,并记住你本质上是什么,我会说,grep缓冲更多的输出,因为isatty(1)将表示它不写TTY(即使你正在看TTY上的输出,通过开球).通过缓冲更多的输出,它减少了write()调用,并且效率更高.运行grep并在终端中观看输出的熟悉行为是线缓冲 – 线条在找到时显示.此选项强制grep在该模式下运行. 请记住,正如手册页警告的那样,这可能会对grep产生影响. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |