进一步阅读

进一步阅读

我写了一个程序(用 Ruby)并且运行良好。它打印出几行文本,然后暂停一分钟,然后重复上述操作。

它运行良好(在 Mac OS X 的终端中),但我注意到,如果我想保留输出记录,可以使用

ruby myscript.rb | tee record.txt

那么输出不会显示在屏幕上,直到输出达到一定的量,也许是几 kb。然而,这可能意味着 5 或 10 分钟屏幕上没有任何内容(如果我按 CTRL-C,文件中也没有任何内容)。

我可以修改程序来刷新输出,但我认为应用程序应该不知道 STDOUT 的输出所使用的内容。那么可以tee让它很好地工作(也许有一个选项),或者可以使用任何其他命令,或者它可能是 Bash 或终端应用程序的一个选项?有办法吗?

答案1

我认为应用程序应该不知道 STDOUT 的输出所使用的内容。

你想错了。包括 C 和 C++ 语言在内的多种编程语言的运行时库都共享根据是否检测到流连接到终端设备来更改缓冲的语义。

在许多情况下,这是语言的定义部分。 C语言标准说,例如:

最初打开时,标准错误流未完全缓冲;当且仅当可以确定标准输入和标准输出流不引用交互设备时,标准输入和标准输出流才被完全缓冲。

如果流未附加到终端设备,通常的选择是选择单元缓冲、行缓冲或完全缓冲。单元缓冲和行缓冲通常用于标准错误;标准输出的完全缓冲。但这确实因语言而异。

因此,当输出流是此类语言中的管道时,要使输出不完全缓冲,您必须

  • 将程序写入自身,使标准输出行缓冲、智能缓冲或无缓冲;
  • 使用挂钩特定编程语言的运行时库的东西,例如stdbuf命令如果您的编程语言是 C 或使用 C 运行时库(其中的 I/O 流部分)作为其基础(某些编程语言不这样做);或者
  • 使用诸如ptybandage使程序认为其标准输出是终端的工具,同时获取该输出并将其发送到管道的写入端。

进一步阅读

答案2

请看一下答案https://stackoverflow.com/a/11337109/5656721因为这是一个常见问题。你可以使用标准缓冲区或者解缓冲也适用于您的 ruby​​ 程序。

相关内容