É 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>

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.