Bisakah mengarahkan ulang stdout dan stderr ke baris file mangle yang sama?

8

Saya pernah membaca bahwa ketika mengarahkan stdoutdan stderrmenggunakan file yang sama 2>&1, stdoutbiasanya memblokir buffered saat stderrunbuffered.

Jika garis yang sangat panjang ditulis stdout, memerlukan dua flush terpisah buffer, mungkinkah garis dari stderrslip di tengah? Sesuatu seperti ini:

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

stderr:   eee<newline>

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

Jawaban:

7

Ya, persis itu bisa terjadi jika antrean stdoutcukup panjang.

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

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

Berlari:

./writer.pl > out 2>&1

Memeriksa: Buka file outdalam editor dan temukan stderr !di antaranya -, tidak selalu di antara ENDdanSTART

Ini akan bervariasi antara OS: s, bahasa dan sistem dalam berbagai cara, tetapi asumsi dasar Anda benar. Bereksperimen dengan memvariasikan panjang stdout-garis: print "-" x 100, print "-" x 10000dll

grebneke
sumber