É possível redirecionar stdout e stderr para o mesmo arquivo de linhas mangle?

8

Eu li que ao redirecionar stdoute stderrpara o mesmo arquivo usando 2>&1, stdoutgeralmente é bloqueado em buffer enquanto não stderré armazenado em buffer.

Se uma linha muito longa for gravada stdout, exigindo duas descargas separadas do buffer, pode acontecer que uma linha stderrdeslize no meio? Algo assim:

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

stderr:   eee<newline>

combined: aaaaaaaaaaaaaaaaeee<newline>
          aaaaaaa<newline>
Daniel Díaz Carrete
fonte

Respostas:

7

Sim, exatamente isso pode acontecer se as linhas stdoutforem longas o suficiente.

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

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

Corrida:

./writer.pl > out 2>&1

Verificação: abra o arquivo outem um editor e encontre stderr !no meio -, nem sempre entre ENDeSTART

Isso variará entre sistemas operacionais: idiomas, s e sistemas de várias maneiras, mas sua suposição básica está correta. Experiência fazendo variar o comprimento de stdout linhas: print "-" x 100, print "-" x 10000etc.

Grebneke
fonte