Bash输出流写入文件。

11 浏览
0 Comments

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只在周期性地写入数据,但我希望立即写入。

有什么建议吗?

0
0 Comments

问题出现的原因是Linux的C标准库根据stdout是否为终端设备来改变输出缓冲模式。如果stdout是终端设备,则为行缓冲:每次写入换行符时都会刷新缓冲区。如果stdout不是终端设备,则为全缓冲:只有在写入一定量的数据后(通常为4 KB到64 KB)才会刷新缓冲区。

因此,当使用shell的重定向操作符“>”将命令的输出重定向到文件时,它不再输出到终端,而是缓冲其输出。程序可以通过setvbuf(3)等函数来更改其缓冲模式,但需要程序配合才能实现。许多程序都有命令行选项来使它们成为行缓冲,例如grep(1)的--line-buffered选项。请查看您的命令是否有类似的选项。

如果没有这样的选项,您可以尝试使用unbuffer(1)等工具来取消缓冲输出流,但它并不总是有效,并且不是标准实用程序,因此不一定总是可用。

0
0 Comments

问题的原因是,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)问题的原因以及解决方法。

0
0 Comments

问题: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`选项来追加内容到文件中,而不是替换文件的内容。这样可以方便地记录和保存输出流的内容。

0