Kann das Umleiten von stdout und stderr zu denselben Datei-Mangle-Zeilen?


8

Ich habe gelesen , dass wenn Umleitung stdoutund stderrauf die gleiche Datei mit 2>&1, stdoutin der Regel gepuffert blockieren , während stderrungepufferte ist.

Wenn in eine sehr lange Zeile geschrieben wird stdout, die zwei separate Spülungen des Puffers erfordert, kann es vorkommen, dass eine Zeile aus stderrder Mitte rutscht? Etwas wie das:

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

stderr:   eee<newline>

combined: aaaaaaaaaaaaaaaaeee<newline>
          aaaaaaa<newline>

Antworten:


7

Ja, genau das kann passieren, wenn die Zeilen stdoutlang genug sind.

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

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

Laufen:

./writer.pl > out 2>&1

Überprüfen: Öffnen Sie die Datei outin einem Editor und suchen Sie stderr !dazwischen -, nicht immer zwischen ENDundSTART

Dies variiert zwischen Betriebssystemen, Sprachen und Systemen auf verschiedene Weise, aber Ihre Grundannahme ist richtig. Experiment von stdout-Linien unterschiedlicher Länge: print "-" x 100, print "-" x 10000usw.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.