Questa è sostanzialmente una risposta negativa. Sembra che né dd
, né mbuffer
, né pv
funziona, tutti i casi, in particolare se la velocità dei dati generati dal produttore può variare molto. Di seguito alcune prove. Dopo aver digitato il comando, attendere circa 10 secondi, quindi digitare >
(per andare alla fine dei dati, ovvero attendere la fine dell'input).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Qui, dopo aver digitato >
, bisogna aspettare 5 secondi, il che significa che il produttore (script zsh) si è bloccato prima del sleep 5
. L'aumento della bs
dimensione, ad esempio 32M, non modifica il comportamento, sebbene il buffer da 32 MB sia abbastanza grande. Sospetto che ciò sia dovuto al fatto che dd
blocchi sull'output invece di continuare con l'input. L'uso oflag=nonblock
non è una soluzione perché questo scarta i dati.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
Con mbuffer
, il problema è che la prima riga (foo0) non appare immediatamente. Non sembra esserci alcuna opzione per abilitare il buffering di linea sull'input.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | pv -q -B 32m | less
Con pv
, il comportamento è simile a dd
. Peggio ancora, sospetto che faccia cose sbagliate al terminale poiché a volte less
non è più possibile ricevere input dal terminale; per esempio, non si può uscire con q
.