Đâ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 pv
hoạ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 bs
kí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 dd
các khối trên đầu ra thay vì tiếp tục với đầu vào. Sử dụng oflag=nonblock
khô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 less
khô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
.