当通过管道输出到文件时,为什么 stderr 和 stdout 的顺序是错误的?

当通过管道输出到文件时,为什么 stderr 和 stdout 的顺序是错误的?

我有一个 perl 脚本:

warn "1\n";
print "2\n";
warn "3\n";
print "4\n";

我将输出传输到一个文件:

perl script.pl &> foo

猫福:

1
3
2
4

为什么输出不按顺序,我该如何修复?

答案1

STDERR 会在打印一行后自动刷新,而 STDOUT 不会。STDOUT 缓冲区仅在已满时才会刷新。若要强制在 STDOUT 上也自动刷新,请使用

STDOUT->autoflush(1);

(如果你有一个较旧的 perl,那么上述方法可能不起作用,而是必须使用类似的方法$| = 1;

相关内容