Це в основному негативна відповідь. Виявляється, що ні dd, ні mbuffer, ні навіть не pvпрацюють всі випадки, зокрема, якщо швидкість даних, створених виробником, може сильно відрізнятися. Я даю кілька тестів нижче. Після введення команди зачекайте приблизно 10 секунд, а потім наберіть >(щоб перейти до кінця даних, тобто чекати закінчення введення).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Тут, після набору тексту >, потрібно почекати 5 секунд, тобто виробник (zsh script) заблокував перед sleep 5. Збільшення bsрозміру, наприклад, 32 М, не змінює поведінку, хоча буфер 32 МБ досить великий. Я підозрюю, що це тому, що ddблоки на виході замість того, щоб продовжуватись із введенням. Використання oflag=nonblockне є рішенням, оскільки це відкидає дані.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
З mbuffer, проблема полягає в тому , що перший рядок (foo0) не виникає відразу. Здається, не існує жодної опції, щоб увімкнути буферизацію рядків на вході.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | pv -q -B 32m | less
З pv, поведінка схожа на dd. Гірше, я підозрюю, що він робить неправильні речі для терміналу, оскільки іноді lessбільше не може отримувати вхід від терміналу; наприклад, з цим не можна кинути q.