2014-12-04 47 views
3
(echo foo && sleep 1 && echo bar) | grep -P . | tee /dev/null 

上面的代码是我能想出的问题的最小案例。预期的行为是foo会被echo'd,第二个会通过,然后bar会被echo'd。grep,tee和睡觉不在一起玩

实际情况是,第二次通过然后foobar被同时回显。如果删除或者greptee命令(或者显然)都会发生正确的行为。但是与他们在一起它不是。

我认为这是某种缓冲问题,但我不知道如何解决它。这段时间里我正在执行的脚本运行了很长一段时间,直到最后才看到任何日志消息。 HALP! :(

+0

可能重复。[bash下力exec'd过程中有缓冲的标准输出] (http://stackoverflow.com/questions/3332045/bash-force-execd-process-to-have-unbuffered-stdout) – 2014-12-04 02:36:37

+3

通过'正确'和'预期',你的意思是'所需'。你看到的行为是无论是正确的还是预期的。 – 2014-12-04 02:43:25

+0

http://mywiki.wooledge.org/BashFAQ/009 – tripleee 2014-12-04 06:53:20

回答

4

伊坦的评论促使我通过grep的的男子页看,我发现--line-buffered标志并称,解决了这一问题

(echo foo && sleep 1 && echo bar) | grep --line-buffered -P . | tee /dev/null