Можно ли перенаправить stdout и stderr на одни и те же строки файла?

8

Я читал, что при перенаправлении stdoutи stderrв один и тот же файл 2>&1, stdoutкак правило, буферизируется блок, а не буферизируется stderr.

Если записана очень длинная строка stdout, требующая двух отдельных очисток буфера, может ли получиться так, что строка stderrпоскальзывается посередине? Что-то вроде этого:

stdout:   aaaaaaaa.....really long line......aaaaaaaaaaaa<newline>

stderr:   eee<newline>

combined: aaaaaaaaaaaaaaaaeee<newline>
          aaaaaaa<newline>
Даниэль Диас Каррет
источник

Ответы:

7

Да, именно это может произойти, если строки stdoutдостаточно длинные.

#!/usr/bin/perl
use strict;
use warnings;

for (1..10) {
    print "START"; print "-" x 100000; print "END\n";
    warn "!\n";
}

Бег:

./writer.pl > out 2>&1

Проверка: откройте файл outв редакторе и найдите stderr !между ними -, не всегда между ENDиSTART

Это может варьироваться в зависимости от ОС, языков и систем по-разному, но ваше основное предположение верно. Экспериментируйте, изменяя длину stdout-строк: print "-" x 100и print "-" x 10000т. Д.

grebneke
источник