web-dev-qa-db-ja.com

出力をファイルにパイピングするとき、stderrとstdoutの順序が間違っているのはなぜですか?

Perlスクリプトがあります:

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

出力をファイルにパイプします。

Perl script.pl &> foo

猫foo:

1
3
2
4

出力が順番どおりにならないのはなぜですか?どうすれば修正できますか?

3
Will Sheppard

STDERRは、行の印刷後に自動的にフラッシュされますが、STDOUTはそうではありません。 STDOUTバッファーは、いっぱいになった場合にのみフラッシュされます。 STDOUTでも自動フラッシュを強制するには

STDOUT->autoflush(1);

(古いPerlを使用している場合、上記は機能しない可能性があり、代わりに$| = 1;などを使用する必要があります)

5
Slaven Rezic