ฉันคิดว่าฉันเห็นทุกอย่างใน UNIX คำถามนี้ตบฉันจากความสบายใจของฉัน เป็นคำถามที่ยอดเยี่ยมมาก!
tail
แสดงบรรทัด X สุดท้าย tail -f
ทำสิ่งเดียวกัน แต่โดยพื้นฐานแล้วในวงวนไม่สิ้นสุด: เมื่อเริ่มต้นให้แสดงบรรทัด X สุดท้ายของไฟล์จากนั้นใช้เวทมนต์ OS (เช่น inotify) ตรวจสอบและแสดงบรรทัดใหม่
ในการทำงานของมันtail
จะต้องสามารถค้นหาจุดสิ้นสุดของไฟล์ได้ หากtail
ไม่พบจุดสิ้นสุดของไฟล์มันจะไม่สามารถแสดงบรรทัด X สุดท้ายได้เพราะ "สุดท้าย" ไม่ได้ถูกกำหนด แล้วtail
ในกรณีนี้จะทำอย่างไร? มันจะรอจนกว่าจะหาจุดสิ้นสุดของไฟล์
พิจารณาสิ่งนี้:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
สิ่งนี้ไม่เคยปรากฏว่ามีความคืบหน้าเนื่องจากไม่มีจุดสิ้นสุดไฟล์ที่chatter
แน่นอน
คุณได้รับพฤติกรรมเดียวกันถ้าคุณขอtail
ให้คุณบรรทัดสุดท้ายจากไปป์ระบบไฟล์ พิจารณา:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
การหลีกเลี่ยงปัญหาที่รับรู้นั้นเป็นความพยายามอันสูงส่ง ความจริงที่สำคัญคือการบัฟเฟอร์ I / O ไม่ใช่สาเหตุที่แท้จริง: การไม่มีจุดสิ้นสุดไฟล์ที่แน่นอนคือ หากคุณตรวจสอบซอร์สโค้ด tail.cคุณจะเห็นfile_lines
ความคิดเห็นของฟังก์ชันอ่าน:
END_POS เป็นไฟล์ออฟเซ็ตของ EOF (ใหญ่กว่าออฟเซ็ตหนึ่งไบต์สุดท้าย)
และนั่นคือเวทมนตร์ คุณต้องมีไฟล์สิ้นสุดเพื่อให้หางทำงานในการกำหนดค่าใด ๆ head
ไม่มีข้อ จำกัด นั้นเพียงแค่ต้องการเริ่มต้นไฟล์ (ซึ่งอาจไม่มีลองhead test.pipe
) สตรีมเครื่องมือที่มุ่งเน้นเช่นsed
และawk
ไม่จำเป็นต้องมีจุดเริ่มต้นหรือจุดสิ้นสุดของไฟล์: มันทำงานบนบัฟเฟอร์