我想在bash中使用以下命令:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] >log.log 2>&1 &
不幸的是,直到它完成(例如通过杀死睡眠命令的ppid),文件log.log
为空,但文件out.out
具有预期的内容。
为了解决这个问题,你需要使grep
行缓冲。这可能取决于实现,但在BSD grep(Mac OS X附带)中,您只需要将--line-buffered
选项添加到grep
:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep --line-buffered ^[A-Z] >log.log 2>&1 &
来自grep
手册页:
--line-buffered
Force output to be line buffered. By default, output is line buffered when standard output is a terminal and block buffered otherwise.
您实际上可以通过输出到STDOUT来验证该行为:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] 2>&1 &
在这种情况下,您不需要显式缓冲,因为这是默认值。但是,重定向到文件时,必须显式设置该行为。