微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash标准输出不能被redirect到文件中

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

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

为什么没有什么要输出到日志文件

你能给我一个解释吗? 先谢谢你

在哪里放shell脚本/函数? .bashrc或bin?

从Bash中另一个更大的文本文件中find文本文件的行的最快方法

归档重新生成shell脚本

符号链接文件比X年龄更新,然后稍后删除符号链接一次文件年龄?

使用多个pipe道从Python执行Shell脚本

如何查找文件中特定行的字节位置

有bash脚本执行多个程序作为单独的进程

如何在bash_profile文件添加export语句?

一个进程已经启动后,grep过滤输出

bash正则expression式在linux上工作,但不是solaris

作为@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 .输出grep . (即匹配所有的行)被缓冲进入管道cat 。 在我的缓冲区似乎是4K左右。 当缓冲区被填充然后被刷新时,你会看到数据chunks的上升数字输出

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐