¿Puede redireccionar stdout y stderr a las mismas líneas de cambio de archivos?

8

He leído que cuando se redirige stdouty se stderrusa el mismo archivo 2>&1, stdoutgeneralmente se bloquea el búfer mientras no stderrestá protegido .

Si se escribe una línea muy larga stdout, que requiere dos descargas separadas del búfer, ¿podría suceder que una línea se stderrdeslice en el medio? Algo como esto:

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

stderr:   eee<newline>

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

Respuestas:

7

Sí, exactamente eso puede suceder si las líneas stdoutson lo suficientemente largas.

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

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

Corriendo:

./writer.pl > out 2>&1

Comprobación: abra el archivo outen un editor y encuentre stderr !en el medio -, no siempre entre ENDySTART

Esto variará entre sistemas operativos, idiomas y sistemas de varias maneras, pero su suposición básica es correcta. Experimento de longitud variable de stdout líneas: print "-" x 100, print "-" x 10000etc.

grebneke
fuente