我正在阅读“高级bash脚本”,在第31章中有问题。我想不明白。
tail -f /var/log/msg | grep 'error' >> logfile
为什么什么都没有输出到日志文件?
你能给我一个解释吗?先感谢您
正如@chepner所说,grep
正在使用更大的缓冲区(也许4k或更多)来缓冲其stdout。管道或重定向到文件时,大多数标准实用程序都会执行此操作。它们通常仅在直接输出到终端时才切换到行缓冲模式。
您可以使用该stdbuf
实用程序强制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
到管道to的输出cat
是行缓冲的,因此您应该看到每行的终端输出,即或多或少的连续输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句