4

我完全不理解这种行为。

我有一个非常简单的 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 捕获到文件中?

4

2 回答 2

10

这是缓冲的效果。当输出到终端时,Perl(就像 stdio 一样)使用基于行的缓冲,这将产生预期的效果。输出到文件时,它使用块缓冲(通常是 4k 或 8k 块),因此它只会在程序结束时刷新。

您观察到的差异是因为 STDERR 是无缓冲的,与大多数其他句柄不同。

$|规避此问题的最简单方法是使用特殊变量在 STDOUT 上启用自动刷新。有关详细信息,请参阅perlvar 。

于 2013-06-29T08:25:35.027 回答
0

不要使用 $|,而是使用 autoflush。

STDOUT->autoflush(1);
STDERR->autoflush(1);

http://perldoc.perl.org/IO/Handle.html

于 2013-06-29T12:55:09.217 回答