bash标准输出无法重定向到文件中

时间:2014-02-21 14:20:05

标签: linux bash shell pipe io-redirection

我正在阅读'高级bash脚本',在第31章中,有一个问题。我想不明白。

tail -f /var/log/msg | grep 'error' >> logfile

为什么没有输出到logfile中? 你能给我一个解释吗? 提前谢谢你

1 个答案:

答案 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。

在第二个命令中,chunks输出到grep的管道是行缓冲的,所以你应该看到每一行的终端输出,即或多或少连续输出