Esta é basicamente uma resposta negativa. Parece que nem dd
, nem mbuffer
, nem pv
funciona, são todos os casos, principalmente se a taxa de dados gerados pelo produtor puder variar muito. Dou alguns casos de teste abaixo. Após digitar o comando, aguarde cerca de 10 segundos e digite >
(para ir para o final dos dados, ou seja, aguarde o final da entrada).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Aqui, depois de digitar >
, é necessário aguardar 5 segundos, o que significa que o produtor (script zsh) foi bloqueado antes do sleep 5
. Aumentar o bs
tamanho para, por exemplo, 32M não altera o comportamento, embora o buffer de 32MB seja grande o suficiente. Eu suspeito que isso ocorre porque dd
bloqueia a saída em vez de continuar com a entrada. Usandooflag=nonblock
não é uma solução porque isso descarta dados.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
Com mbuffer
, o problema é que a primeira linha (foo0) não aparece imediatamente. Não parece haver nenhuma opção para ativar o buffer de linha na entrada.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | pv -q -B 32m | less
Com pv
, o comportamento é semelhante a dd
. Pior, suspeito que ele faça coisas erradas no terminal, pois às vezes less
não pode mais receber informações do terminal; por exemplo, não se pode desistir q
.