(echo foo && sleep 1 && echo bar) | grep -P . | tee /dev/null
Run Code Online (Sandbox Code Playgroud)
上面的代码是我能想到的最小的问题案例。预期的行为是foo会被回显,一秒钟过去,然后bar会被回显。
实际发生的情况是,一秒钟过去了foo,并bar同时得到回声。如果您删除或命令(或两者,显然) grep,tee则会发生正确的行为。但当他们在一起时,情况就不是这样了。
我认为这是某种缓冲问题,但我不知道如何解决它。对我来说,实际发生的脚本已经运行了很长一段时间,直到最后我才看到任何日志消息。哈普!:(
Etan 的评论促使我查看 grep 的手册页,并找到了该--line-buffered标志。添加即可解决问题
(echo foo && sleep 1 && echo bar) | grep --line-buffered -P . | tee /dev/null
Run Code Online (Sandbox Code Playgroud)