Jest to w zasadzie odpowiedź negatywna. Wygląda na to dd
, że ani wszystkie mbuffer
, ani nawet nie pv
dział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 bs
rozmiaru do np. 32M nie zmienia zachowania, chociaż bufor 32 MB jest wystarczająco duży. Podejrzewam, że dd
dzieje się tak, ponieważ blokuje wyjście, a nie kontynuuje wprowadzanie danych. Używanie oflag=nonblock
nie 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 pv
zachowanie jest podobne do dd
. Co gorsza, podejrzewam, że źle robi to terminalowi, ponieważ czasami less
nie może już odbierać danych wejściowych z terminalu; na przykład nie można go rzucić q
.