При отправке вывода в файл почему 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;)

Другие вопросы по тегам