将输出管道传输到文件时使用行缓冲

将输出管道传输到文件时使用行缓冲

我有一个打印到 的 perl 程序stdout,然后将其通过管道传输到一个文件中,如下所示:

./skript.pl > file.txt 2>&1

这使得该脚本缓冲区的输出。但是,我希望能够看到脚本目前正在做什么,因此我试图找到一种在此设置中启用行缓冲的方法,以便在出现时立即打印输出\n。 (如果我只是打印到终端,这是正常行为。)

我需要一个无需在 CentOS 上安装任何东西即可使用的解决方案。

更改 perlscript 内的内容是一种选择。我已经尝试过了,但这比我想要的要多:如果尚未打印当前行的末尾,$|它会弄乱输出。cat file.txt

答案1

在您的脚本中您可以使用:

STDOUT->flush;

刷新输出缓冲区。

您甚至可以STDOUT->autoflush(1);全局设置。

要刷新换行符,只需尝试:

STDOUT->autoflush(0);
open STDOUT, ">/tmp/script.out"
.
.
close STDOUT;

答案2

您可能想运行您的脚本标准缓冲区,它有一个行缓冲选项:

stdbuf --output=L --error=L command

优点是不用修改代码。您还可以使用stdbuf没有可用源代码的实用程序,或者当构建此类实用程序很棘手时。

答案3

通过 stderr 重定向怎么样?默认情况下它应该是无缓冲的:

./skript.pl 2> file.txt 1>&2

相关内容