มีความแตกต่างระหว่าง unbuffer (1) และ stdbuf (1) หรือไม่? จากสิ่งที่ฉันรวบรวม unbuffer ทำมากกว่า "ความพยายามที่ดีที่สุด" ในการเรียกใช้ฟังก์ชัน libc set (X) buf ที่จุดเริ่มต้นแล้วปล่อยให้สิ่งต่าง ๆ เป็นอย่างไร
มีความแตกต่างระหว่าง unbuffer (1) และ stdbuf (1) หรือไม่? จากสิ่งที่ฉันรวบรวม unbuffer ทำมากกว่า "ความพยายามที่ดีที่สุด" ในการเรียกใช้ฟังก์ชัน libc set (X) buf ที่จุดเริ่มต้นแล้วปล่อยให้สิ่งต่าง ๆ เป็นอย่างไร
คำตอบ:
พวกเขาทำงานในรูปแบบที่แตกต่างกันโดยสิ้นเชิง
โปรแกรม unbuffer ใช้คาดว่าจะรันคำสั่ง named เนื่องจากความคาดหวังสร้าง pseudo-tty เพื่อแนบกับ stdout ของกระบวนการลูกเด็กอาจถูกหลอกให้คิดว่าควรใช้ line-buffering แทน block-buffering บางโปรแกรมจะเปลี่ยนพฤติกรรมของพวกเขาเมื่อ isatty (stdout) เป็นจริงโปรแกรมอื่น ๆ จะไม่และมันยากมากที่จะรู้ว่าจะและจะไม่
โปรแกรม stdbuf พยายามใส่ libstdbuf ต่อหน้า libc สำหรับไบนารีที่โหลดแบบไดนามิก โดยที่ libstdbuf นิยามกลยุทธ์การบัฟเฟอร์เริ่มต้นของการโทร libc stdio ใหม่
ฉันพบสิ่งนี้โดย
apt-get source expect coreutils
และการอ่านแหล่งข้อมูลที่เกี่ยวข้องสำหรับแต่ละโปรแกรม
unbuffer -p
อาจทำงานไม่ถูกต้องหากกระบวนการป้อนข้อมูลไปยังทางออกที่ไม่มีบัฟเฟอร์ พิจารณา:process1 | unbuffer -p process2 | process3
หากกระบวนการ 1 ออกจากกระบวนการ 2 อาจยังไม่เสร็จสิ้น มันเป็นไปไม่ได้ที่ unbuffer จะต้องรอนานถึง