我完全不理解这种行为。
我有一个非常简单的Perl脚本:
#!/usr/bin/perl
use strict;
use warnings;
print "line 1\n";
print STDERR "line 2\n";
如果我从控制台运行它,我会得到我期望的结果:
$ perl a.pl
line 1
line 2
但是如果我将它重定向到文件,我会按相反的顺序得到这些行:
$ perl a.pl &> a
$ cat a
line 2
line 1
如何使用相同的方法将所有输出STDOUT + STDERR捕获到文件中 我订进控制台了吗?
答案 0 :(得分:10)
这是缓冲的效果。当输出到终端时,Perl(就像stdio一样)使用基于行的缓冲,这将产生预期的效果。输出到文件时,它使用块缓冲(通常为4k或8k块),因此它只会在程序结束时刷新。
您观察到的差异是因为STDERR是无缓冲的,与大多数其他句柄不同。
解决此问题的最简单方法是使用$|
特殊变量在STDOUT上启用自动刷新功能。有关详细信息,请参阅perlvar。
答案 1 :(得分:0)
不要使用$ |,而是使用autoflush。
STDOUT->autoflush(1);
STDERR->autoflush(1);
请参阅http://perldoc.perl.org/IO/Handle.html