Це в основному негативна відповідь. Виявляється, що ні 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
.