grep、tee 和 sleep 配合得不好

Med*_*her 3 bash grep tee

(echo foo && sleep 1 && echo bar) | grep -P . | tee /dev/null
Run Code Online (Sandbox Code Playgroud)

上面的代码是我能想到的最小的问题案例。预期的行为是foo会被回显,一秒钟过去,然后bar会被回显。

实际发生的情况是,一秒钟过去了foo,并bar同时得到回声。如果您删除命令(或两者,显然) greptee则会发生正确的行为。但当他们在一起时,情况就不是这样了。

我认为这是某种缓冲问题,但我不知道如何解决它。对我来说,实际发生的脚本已经运行了很长一段时间,直到最后我才看到任何日志消息。哈普!:(

Med*_*her 5

Etan 的评论促使我查看 grep 的手册页,并找到了该--line-buffered标志。添加即可解决问题

(echo foo && sleep 1 && echo bar) | grep --line-buffered -P . | tee /dev/null
Run Code Online (Sandbox Code Playgroud)