Bash输出流写入文件。
Bash输出流写入文件。
我在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
这个命令会持续运行,只要有任何原因就会输出内容。因此,它没有执行的终点。
不过,echo命令运行得很好,但是当我尝试使用'>'操作符时,它似乎无法写入文件。
比如:
#somedevice -getevent > my_record_file
这个命令无法正常工作,my_record_file只在周期性地写入数据,但我希望立即写入。
有什么建议吗?
问题出现的原因是Linux的C标准库根据stdout是否为终端设备来改变输出缓冲模式。如果stdout是终端设备,则为行缓冲:每次写入换行符时都会刷新缓冲区。如果stdout不是终端设备,则为全缓冲:只有在写入一定量的数据后(通常为4 KB到64 KB)才会刷新缓冲区。
因此,当使用shell的重定向操作符“>”将命令的输出重定向到文件时,它不再输出到终端,而是缓冲其输出。程序可以通过setvbuf(3)等函数来更改其缓冲模式,但需要程序配合才能实现。许多程序都有命令行选项来使它们成为行缓冲,例如grep(1)的--line-buffered选项。请查看您的命令是否有类似的选项。
如果没有这样的选项,您可以尝试使用unbuffer(1)等工具来取消缓冲输出流,但它并不总是有效,并且不是标准实用程序,因此不一定总是可用。
问题的原因是,somedevice
命令可能使用了"标准输入/输出库",在该库中,默认情况下打开了缓冲区。只有当输出到终端/控制台时,才会关闭缓冲区。
要解决这个问题,有两种方法。首先,你可以修改somedevice
程序,以便禁用缓冲区。如果你无法修改该程序,仍然可以通过一些技巧来绕过缓冲区。详细的方法可以参考http://www.pixelbeat.org/programming/stdio_buffering/。
这篇文章介绍了一个关于如何禁用缓冲区的技术。你可以使用setvbuf
函数来设置缓冲区,将其设置为无缓冲模式(_IONBF)。这样,输出将立即写入文件而不是缓冲起来。
下面是一个示例代码,展示了如何使用setvbuf
函数来禁用缓冲区:
#include
#include
int main() {
FILE* file = fopen("output.txt", "w");
if (file == NULL) {
printf("Failed to open file\n");
exit(1);
}
// Disable buffering
setvbuf(file, NULL, _IONBF, 0);
// Write to file
fprintf(file, "This is a test\n");
// Close file
fclose(file);
return 0;
}
以上代码将输出字符串"This is a test"到名为"output.txt"的文件中,并且禁用了缓冲区,确保输出立即写入文件。
希望这篇文章能帮助你理解(Bash output stream write to a file)问题的原因以及解决方法。
问题:Bash输出流写入文件的原因和解决方法
在Bash中,有时候我们需要将输出流输出到文件中,但是默认情况下,Bash只会将输出流显示在终端上,而不会写入文件。那么我们如何将输出流写入文件呢?
解决方法之一是使用`tee`命令。`tee`命令的作用是将从输入流中读取的内容同时输出到终端和文件中。下面是使用`tee`命令将输出流写入文件的示例代码:
somedevice -getevent | tee -a my_record_file
在上面的示例中,`somedevice -getevent`命令会产生一个输出流,`|`管道符将该输出流传递给`tee`命令。`-a`选项用于追加内容到文件中,而不是替换文件的内容。`my_record_file`是要写入的文件名。
通过使用`tee`命令,我们可以将输出流同时显示在终端上和写入文件中。这样就可以方便地记录输出流的内容,以备后续查看或分析。
通过使用`tee`命令,我们可以将Bash的输出流写入文件中。在命令行中使用`tee`命令时,可以通过`-a`选项来追加内容到文件中,而不是替换文件的内容。这样可以方便地记录和保存输出流的内容。