我想在bash中使用以下命令:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] >log.log 2>&1 &
很不幸,在任务完成之前(例如通过杀死sleep命令的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.
实际上,你可以将其转换成以下代码:
(while true; do date; sleep 1;done) | tee out.out 2>&1 | grep ^[A-Z] 2>&1 &
grep
在处理文件时会缓存它。使用grep --line-buffered '^[A-Z]'
使其在读取行时立即输出。顺便提一下,注意我在正则表达式周围加上了引号--这里不太可能出现问题,但是如果没有引号,模式可能会在传递给grep
之前被扩展为shell通配符模式,这将产生奇怪的结果。 - Gordon Davisson