Esto es básicamente una respuesta negativa. Parece que ni dd
, ni mbuffer
, ni siquiera pv
funciona son todos los casos, en particular si la tasa de datos generados por el productor puede variar mucho. Doy algunos casos de prueba a continuación. Después de escribir el comando, espere unos 10 segundos, luego escriba >
(para ir al final de los datos, es decir, espere al final de la entrada).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Aquí, después de escribir >
, hay que esperar 5 segundos, lo que significa que el productor (secuencia de comandos zsh) ha bloqueado antes que sleep 5
. Aumentar el bs
tamaño a, por ejemplo, 32M no cambia el comportamiento, aunque el búfer de 32MB es lo suficientemente grande. Sospecho que esto se debe a que los dd
bloques en la salida en lugar de continuar con la entrada. Usar oflag=nonblock
no es una solución porque esto descarta datos.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
Con mbuffer
, el problema es que la primera línea (foo0) no aparece inmediatamente. No parece haber ninguna opción para habilitar el almacenamiento en línea en la entrada.
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
, el comportamiento es similar a dd
. Peor aún, sospecho que hace cosas incorrectas al terminal, ya que a veces less
ya no puede recibir información del terminal; por ejemplo, no se puede abandonar con q
.