นี่เป็นคำตอบเชิงลบ ปรากฏว่าค่า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
ขนาดเป็น 32M ไม่ได้เปลี่ยนพฤติกรรม แต่บัฟเฟอร์ 32MB นั้นใหญ่พอ ฉันสงสัยว่าเป็นเพราะ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
ตัวอย่างหนึ่งไม่สามารถออกจากมันด้วย