คำสั่งโดยทั่วไปจะไม่บัฟเฟอร์อินพุตของพวกเขา พวกเขาจะทำread()
สำหรับก้อนขนาดใหญ่ แต่เมื่ออ่านจากไปป์ถ้ามีไม่กี่ไบต์ในไปป์การread()
เรียกของระบบจะกลับมาพร้อมกับตัวอักษรจำนวนมากที่มีอยู่และโดยทั่วไปแอปพลิเคชันจะทำงานด้วยถ้ามันสามารถ .
ข้อยกเว้นที่น่าสังเกตซึ่งเป็นmawk
สิ่งที่จะทำread()
ต่อไปจนกว่าบัฟเฟอร์อินพุตจะเต็ม
แอ็พพลิเคชันทำบัฟเฟอร์เอาต์พุตของตน(stdout) แม้ว่า พฤติกรรมปกติคือถ้าเอาท์พุทจะไป tty แล้วการบัฟเฟอร์จะเป็นบรรทัดที่ชาญฉลาด (นั่นคือมันจะไม่เริ่มเขียนไปยัง stdout จนกว่าจะมีสายเต็มไปยังเอาท์พุทหรือบล็อกเต็มสำหรับมาก สายยาว) ในขณะที่ไฟล์ประเภทอื่นทุกประเภทการบัฟเฟอร์คือโดยบล็อก (นั่นคือมันจะไม่เริ่มเขียนจนกว่าจะมีหนึ่งบล็อกเต็มในการเขียน (บางอย่างเช่น 4KiB / 8KiB ... ขึ้นอยู่กับซอฟต์แวร์และระบบ ))
ดังนั้นในกรณีของคุณLongRunningCommand
อาจบัฟเฟอร์ส่งออกโดยบล็อก (เนื่องจากเอาท์พุทเป็นท่อและไม่ใช่ tty) และtr
มีแนวโน้มบัฟเฟอร์เอาต์พุตโดยบรรทัดเนื่องจากเอาต์พุตอาจเป็นเทอร์มินัล
แต่เนื่องจากคุณลบอักขระบรรทัดใหม่ทุกตัวออกจากเอาต์พุตมันจะไม่ส่งออกบรรทัดดังนั้นการบัฟเฟอร์จะเป็นบล็อก
ดังนั้นที่นี่คุณต้องการที่จะปิดการใช้งานสำหรับทั้งบัฟเฟอร์และLongRunningCommand
tr
บนระบบ GNU หรือ FreeBSD:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
paste -sd , -
หมายเหตุว่าถ้าคุณต้องการที่จะเข้าร่วมสายด้วยเครื่องหมายจุลภาคเป็นวิธีการที่ดีคือการใช้งาน ด้วยวิธีนี้ผลลัพธ์จะถูกยกเลิกด้วยอักขระขึ้นบรรทัดใหม่ (คุณอาจต้องปิดการใช้งานการบัฟเฟอร์)
stdbuf
กับ LongRunningCommand หรือ tr หรือทั้งสองอย่างแตกต่างกันหรือไม่?