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

Wil*_*ard 3 bash perl pipe stdout

我有一个 perl 脚本:

warn "1\n";
print "2\n";
warn "3\n";
print "4\n";
Run Code Online (Sandbox Code Playgroud)

我将输出通过管道传输到文件:

perl script.pl &> foo
Run Code Online (Sandbox Code Playgroud)

猫福:

1
3
2
4
Run Code Online (Sandbox Code Playgroud)

为什么输出不按顺序,我该如何解决?

小智 5

打印一行后会自动刷新 STDERR,而 STDOUT 则不会。只有在 STDOUT 缓冲区已满时才会刷新它。在 STDOUT 上也强制自动刷新使用

STDOUT->autoflush(1);
Run Code Online (Sandbox Code Playgroud)

(如果你有一个旧的 perl,那么上面的可能不起作用,你必须使用类似的东西$| = 1;