Peut rediriger stdout et stderr vers les mêmes lignes de mangle de fichier?

8

J'ai lu que lors de la redirection stdoutet stderrvers le même fichier à l'aide 2>&1, il stdoutest généralement mis en mémoire tampon tandis qu'il stderrest sans tampon .

Si une très longue ligne est écrite stdout, nécessitant deux vidages séparés du tampon, pourrait-il arriver qu'une ligne de stderrglisse au milieu? Quelque chose comme ça:

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

stderr:   eee<newline>

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

Réponses:

7

Oui, cela peut arriver si les lignes stdoutsont suffisamment longues.

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

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

Fonctionnement:

./writer.pl > out 2>&1

Vérification: ouvrez le fichier outdans un éditeur et recherchez stderr !entre les deux -, pas toujours entre ENDetSTART

Cela variera entre les systèmes d'exploitation, les langues et les systèmes de diverses manières, mais votre hypothèse de base est correcte. Expérience en faisant varier la longueur des lignes stdout: print "-" x 100, print "-" x 10000etc.

grebneke
la source