Đây về cơ bản là một câu trả lời tiêu cực. Dường như không phải dd, cũng không mbuffer, thậm chí không pvhoạt động là tất cả các trường hợp, đặc biệt nếu tốc độ dữ liệu do nhà sản xuất tạo ra có thể thay đổi rất nhiều. Tôi đưa ra một số thử nghiệm dưới đây. Sau khi gõ lệnh, đợi khoảng 10 giây, sau đó nhập >(để đi đến cuối dữ liệu, tức là đợi kết thúc đầu vào).
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | dd bs=64K | less
Ở đây, sau khi gõ >, người ta phải đợi 5 giây, nghĩa là nhà sản xuất (tập lệnh zsh) đã bị chặn trước sleep 5. Việc tăng bskích thước lên ví dụ 32M sẽ không thay đổi hành vi, mặc dù bộ đệm 32 MB đủ lớn. Tôi nghi ngờ rằng điều này là do ddcác khối trên đầu ra thay vì tiếp tục với đầu vào. Sử dụng oflag=nonblockkhông phải là một giải pháp vì điều này loại bỏ dữ liệu.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | mbuffer -q | less
Với mbuffer, vấn đề là dòng đầu tiên (foo0) không xuất hiện ngay lập tức. Dường như không có bất kỳ tùy chọn nào để kích hoạt bộ đệm dòng trên đầu vào.
zsh -c 'echo foo0; sleep 3; \
printf "Line %060d\n" {1..123456}; \
echo foo1; sleep 5; \
echo foo2' | pv -q -B 32m | less
Với pv, hành vi tương tự như dd. Tồi tệ hơn, tôi nghi ngờ rằng nó làm những điều sai trái với thiết bị đầu cuối vì đôi khi lesskhông thể nhận được đầu vào từ thiết bị đầu cuối; ví dụ, người ta không thể bỏ nó với q.