Il reindirizzamento di stdout e stderr sullo stesso file può essere modificato?


8

Ho letto che quando si reindirizza stdoute si stderrutilizza lo stesso file 2>&1, di stdoutsolito viene bufferizzato mentre stderrnon è bufferizzato.

Se viene scritta una linea molto lunga stdout, che richiede due flush separati del buffer, potrebbe accadere che una linea da stderrscivoli nel mezzo? Qualcosa come questo:

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

stderr:   eee<newline>

combined: aaaaaaaaaaaaaaaaeee<newline>
          aaaaaaa<newline>

Risposte:


7

Sì, può accadere esattamente se le linee stdoutsono abbastanza lunghe.

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

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

In esecuzione:

./writer.pl > out 2>&1

Verifica: aprire il file outin un editor e trovare stderr !tra -, non sempre tra ENDeSTART

Questo varierà tra SO: s, lingue e sistemi in vari modi, ma il tuo presupposto di base è corretto. Sperimentare variando la lunghezza delle linee stdout: print "-" x 100, print "-" x 10000etc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.