Jest to w zasadzie odpowiedź negatywna. Wygląda na to dd, że ani wszystkie mbuffer, ani nawet nie pvdziałają we wszystkich przypadkach, w szczególności jeśli szybkość danych generowanych przez producenta może się bardzo różnić. Poniżej podaję kilka przypadków testowych. Po wpisaniu polecenia poczekaj około 10 sekund, a następnie wpisz >(aby przejść do końca danych, tj. Poczekać na koniec danych wejściowych).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Tutaj po wpisaniu >trzeba poczekać 5 sekund, co oznacza, że producent (skrypt zsh) zablokował się przed sleep 5. Zwiększenie bsrozmiaru do np. 32M nie zmienia zachowania, chociaż bufor 32 MB jest wystarczająco duży. Podejrzewam, że dddzieje się tak, ponieważ blokuje wyjście, a nie kontynuuje wprowadzanie danych. Używanie oflag=nonblocknie jest rozwiązaniem, ponieważ powoduje to odrzucenie danych.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
Dzięki mbuffer, problem jest, że pierwsza linia (foo0) nie pojawia się natychmiast. Wydaje się, że nie ma opcji włączenia buforowania linii na wejściu.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | pv -q -B 32m | less
Z pvzachowanie jest podobne do dd. Co gorsza, podejrzewam, że źle robi to terminalowi, ponieważ czasami lessnie może już odbierać danych wejściowych z terminalu; na przykład nie można go rzucić q.