Perl 为什么输出没有被重定向到文件中?

Perl 为什么输出没有被重定向到文件中?,perl,bash,redirect,output,Perl,Bash,Redirect,Output,我有以下命令行,它通过perl脚本每秒输出vmstat,每行上都有一个时间戳: vmstat 15 | /home/Beer/addtimestamp.pl > File_1 addtimestamp.pl的内容: !/usr/bin/perl while (<>) { print localtime() . ": $_"; } 那么,为什么输出没有被重定向到文件_1文件呢 当我不这样做时,它可以完美地工作,它每秒完美地打印输出,没有任何问题。当输出到终端时,perl的输

我有以下命令行,它通过perl脚本每秒输出vmstat,每行上都有一个时间戳:

vmstat 15 | /home/Beer/addtimestamp.pl > File_1 
addtimestamp.pl的内容:

!/usr/bin/perl
while (<>) { print localtime() . ": $_"; }
那么,为什么输出没有被重定向到文件_1文件呢


当我不这样做时,它可以完美地工作,它每秒完美地打印输出,没有任何问题。

当输出到终端时,perl的输出是行缓冲的,因此您可以看到每一行的输出。当它的输出是一个文件时,它将被块缓冲,所以在一个完整的块准备好写入4k之前,您将看不到任何输出,我认为是变量和系统定义的

您需要将stdout设置为使用行缓冲:

$|=1;

搜索[perl line buffered output],您将看到大量关于这方面的结果。

当输出到终端时,perl的输出是行缓冲的,因此您将看到每一行的输出。当它的输出是一个文件时,它将被块缓冲,所以在一个完整的块准备好写入4k之前,您将看不到任何输出,我认为是变量和系统定义的

您需要将stdout设置为使用行缓冲:

$|=1;

搜索[perl line buffered output],您将看到大量关于这方面的结果。

我用上面的内容开始编写脚本,从而使其正常工作,非常感谢!,我只希望它在输出到文件时默认是行缓冲的。再次感谢!!学究式的,最好写为:local$|=1@cdarke添加“local”是什么意思?local确保效果是本地化的,并且在更改任何Perl系统全局变量时都应该使用。您在这里并不绝对需要它,但如果您将代码剪切粘贴到子例程中,它将确保效果是该代码块的局部效果。@i-am-l相信我,您真的不希望默认情况下它是行缓冲的。这样做会导致非常糟糕的性能的情况比不方便的情况要常见得多。我是从上面的脚本开始工作的,非常感谢!,我只希望它在输出到文件时默认是行缓冲的。再次感谢!!学究式的,最好写为:local$|=1@cdarke添加“local”是什么意思?local确保效果是本地化的,并且在更改任何Perl系统全局变量时都应该使用。您在这里并不绝对需要它,但如果您将代码剪切粘贴到子例程中,它将确保效果是该代码块的局部效果。@i-am-l相信我,您真的不希望默认情况下它是行缓冲的。这样做会导致极其糟糕的性能的情况比不方便的情况更常见。