我正在阅读'高级bash脚本',在第31章中,有一个问题。我想不明白。
tail -f /var/log/msg | grep 'error' >> logfile
为什么没有输出到logfile中? 你能给我一个解释吗? 提前谢谢你
答案 0 :(得分:3)
作为@chepner评论,grep
正在使用更大的缓冲区(可能是4k或更多)来缓冲其标准输出。管道或重定向到文件时,大多数标准实用程序都会执行此操作。它们通常只在直接输出到终端时才切换到行缓冲模式。
您可以使用stdbuf
utility强制grep
对其输出进行行缓冲:
tail -f /var/log/msg | stdbuf -oL grep 'error' >> logfile
作为这种效果的易于观察的演示,您可以尝试以下两个命令:
for ((i=0;;i++)); do echo $i; sleep 0.001; done | grep . | cat
和
for ((i=0;;i++)); do echo $i; sleep 0.001; done | stdbuf -oL grep . | cat
在第一个命令中,来自grep .
的输出(即匹配所有行)被缓冲进入管道cat
。在我的缓冲区似乎是约4k。 1}}当缓冲区被填充然后刷新时,您将看到升序数字输出。
在第二个命令中,chunks
输出到grep
的管道是行缓冲的,所以你应该看到每一行的终端输出,即或多或少连续输出