`unbuffer` หรือ` stdbuf` สำหรับการลบ stdout buffering?


13

มีความแตกต่างระหว่าง unbuffer (1) และ stdbuf (1) หรือไม่? จากสิ่งที่ฉันรวบรวม unbuffer ทำมากกว่า "ความพยายามที่ดีที่สุด" ในการเรียกใช้ฟังก์ชัน libc set (X) buf ที่จุดเริ่มต้นแล้วปล่อยให้สิ่งต่าง ๆ เป็นอย่างไร

คำตอบ:


14

พวกเขาทำงานในรูปแบบที่แตกต่างกันโดยสิ้นเชิง

โปรแกรม unbuffer ใช้คาดว่าจะรันคำสั่ง named เนื่องจากความคาดหวังสร้าง pseudo-tty เพื่อแนบกับ stdout ของกระบวนการลูกเด็กอาจถูกหลอกให้คิดว่าควรใช้ line-buffering แทน block-buffering บางโปรแกรมจะเปลี่ยนพฤติกรรมของพวกเขาเมื่อ isatty (stdout) เป็นจริงโปรแกรมอื่น ๆ จะไม่และมันยากมากที่จะรู้ว่าจะและจะไม่

โปรแกรม stdbuf พยายามใส่ libstdbuf ต่อหน้า libc สำหรับไบนารีที่โหลดแบบไดนามิก โดยที่ libstdbuf นิยามกลยุทธ์การบัฟเฟอร์เริ่มต้นของการโทร libc stdio ใหม่

ฉันพบสิ่งนี้โดย

 apt-get source expect coreutils

และการอ่านแหล่งข้อมูลที่เกี่ยวข้องสำหรับแต่ละโปรแกรม


บางสิ่งที่น่ากังวล (จาก manpage): unbuffer -pอาจทำงานไม่ถูกต้องหากกระบวนการป้อนข้อมูลไปยังทางออกที่ไม่มีบัฟเฟอร์ พิจารณา: process1 | unbuffer -p process2 | process3หากกระบวนการ 1 ออกจากกระบวนการ 2 อาจยังไม่เสร็จสิ้น มันเป็นไปไม่ได้ที่ unbuffer จะต้องรอนานถึง
dan3

ดูเหมือนว่า stdbuf ยังสามารถควบคุม stdin buffering ของโปรแกรมที่ใช้สตรีม C ซึ่งดูเหมือนสำคัญ บางทีนี่อาจรวมอยู่ในคำตอบเพื่อประโยชน์ของผู้อ่านในอนาคต
dan3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.