gnu coreutils diviso verboso arrossato?


0

Quando si usano i coreutils GNU split comando con modalità dettagliata, come posso far svuotare le righe che appaiono nello STDOUT rispetto al momento in cui il file è stato finalmente creato?

Esempio di esempio, eseguendolo in questo modo:

~/coreutils/bin/split --verbose -d -u -l 10000000 1>out & tail -f out
creating file `x00'
creating file `x01'
creating file `x02'
[...]

Mi sarei aspettato la linea creating file 'x00' essere apparso nel file out dopo che il file è stato completamente scritto, ma sembra che non vi sia scritto nulla out fino a quando l'intero file è stato finalmente elaborato. C'è un modo per cambiare questo comportamento?


Penso che tutti i coreutils GNU usino il buffering dell'output, quindi non genereranno nulla finché il buffer non sarà riempito o prima se l'output è un terminale interattivo.
MV.

l'output su stdout è bufferizzato, stderr no.
lornix

Risposte:


1

Ok, le vecchie versioni di coreutils GNU (prima di 7.5) non hanno una soluzione facile (per quanto ne so), ma le versioni più recenti (dal 7.5) hanno un stdbuf comando che è possibile utilizzare per forzare split (o qualsiasi altro programma coreutil) per stampare immediatamente l'output. Nel tuo caso, puoi usare:

~/coreutils/bin/stdbuf -o0 ~/coreutils/bin/split --verbose -d -u -l 10000000 1>out & tail -f out

Questo verrà eseguito diviso con buffer di output disabilitato.

Si noti che l'opzione -u (senza buffer) in split non influisce sulla stampa dei messaggi, ma solo sui dati che si stanno suddividendo (sembra più lento se si disabilita tale buffering).

Informazioni su stdbuf: http://www.gnu.org/software/coreutils/manual/html_node/stdbuf-invocation.html

Per un'alternativa quando si utilizzano versioni di coreutils precedenti, controllare questa soluzione utilizzando il comando unbuffer dal pacchetto aspettate (tcl): https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe

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.