Bash输出流写入文件

时间:2012-03-17 17:46:26

标签: linux bash shell ubuntu

所以我在bash上运行它:

# somedevice -getevent

这个命令的作用是它一直在运行,每当我的设备发送某个数据时,说它检测到温度的变化,就输出这样的东西

/dev/xyz: 123 4567 8910112238 20
/dev/xyz: 123 4567 8915712347 19
/dev/xyz: 123 4567 8916412345 22
/dev/xyz: 123 4567 8910312342 25
/dev/xyz: 123 4567 8910112361 18
/dev/xyz: 123 4567 8910112343 20

这只是一直在运行,一旦有任何原因它会输出一些东西。所以执行无止境。

当我尝试使用'>'时,回声无法正常工作运算符这似乎不写入文件。

所以例如

#somedevice -getevent > my_record_file

这不能正常工作,my_record_file只能在间隔中写入数据,但是我想立即写入。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

输出正在缓冲,因为C标准库根据stdout是否是终端设备来更改输出缓冲模式。如果它是终端设备(根据isatty(3)),则stdout 行缓冲:每次写入换行符时都会刷新它。如果它不是终端设备,那么完全缓冲:只有在写入一定数量的数据(通常大约为4 KB到64 KB)时才会刷新它。

因此,当您使用shell的>重定向运算符将命令的输出重定向到文件时,它不再输出到终端并缓冲其输出。程序可以使用setvbuf(3)和朋友更改其缓冲模式,但程序必须合作才能执行此操作。许多程序具有命令行选项以使它们进行行缓冲,例如, grep(1)的{​​{1}}选项。看看你的命令是否有类似的选项。

如果您没有这样的选项,可以尝试使用unbuffer(1)之类的工具来解压缩输出流,但它并不总是有效并且不是标准实用程序,所以它不是永远可用。

答案 1 :(得分:2)

命令somedevice可能使用“标准输入/输出库”,并且在该库中,默认情况下启用缓冲。当输出到终端/控制台时,它会关闭。

您可以修改somedevice计划吗?如果没有,你仍然可以破解它。有关详细信息,请参阅http://www.pixelbeat.org/programming/stdio_buffering/

答案 2 :(得分:0)

你可以尝试'tee':

somedevice -getevent | tee -a my_record_file

'-a'选项是追加而不是仅替换内容。

答案 3 :(得分:0)

这可能是因为你的“somedevice -getevent”命令的stdout正在被块缓冲。根据{{​​3}},如果stdout是终端,stdout默认是行缓冲的(即你想要的),否则就是块缓冲。

我将查看somedevice命令的手册,看看是否可以强制输出无缓冲或行缓冲。如果没有,stdbuf -oL somedevice -getevent > my_record_file应该做你想做的事。