将两个并发程序的输出与bash组合

前端之家收集整理的这篇文章主要介绍了将两个并发程序的输出与bash组合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从两个并发程序(日志文件尾)捕获输出到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产生影响.

原文链接:https://www.f2er.com/bash/386564.html

猜你在找的Bash相关文章