Это в основном отрицательный ответ. Похоже, что ни 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) заблокирован перед 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
.