Pode redirecionar stdout e stderr para as mesmas linhas de mangle de arquivos?

8

Eu li que, ao redirecionar stdout e stderr para o mesmo arquivo usando 2>&1 , stdout é geralmente armazenado em buffer de bloco, enquanto stderr não é bufferizado.

Se uma linha muito longa for gravada em stdout , exigindo dois fluxos separados do buffer, pode acontecer que uma linha de stderr escorregue no meio? Algo parecido com isto:

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

stderr:   eee<newline>

combined: aaaaaaaaaaaaaaaaeee<newline>
          aaaaaaa<newline>
    
por Daniel Díaz Carrete 08.02.2014 / 12:44

1 resposta

7

Sim, exatamente isso pode acontecer se as linhas para stdout forem longas o suficiente.

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

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

Em exibição:

./writer.pl > out 2>&1

Verificação: Abra o arquivo out em um editor e localize stderr ! entre - , nem sempre entre END e START

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

    
por 08.02.2014 / 12:55