Tôi nghĩ rằng tôi đã thấy mọi thứ trong UNIX. Câu hỏi này đã tát tôi ra khỏi sự tự mãn của tôi. Thật là một câu hỏi tuyệt vời!
tail
hiển thị các dòng X cuối cùng. tail -f
thực hiện tương tự, nhưng về cơ bản là trong một vòng lặp vô hạn: khi khởi động, hiển thị các dòng X cuối cùng của tệp, sau đó sử dụng một số phép thuật hệ điều hành (như inotify), theo dõi và hiển thị các dòng mới.
Để thực hiện công việc của nó, tail
phải có khả năng xác định vị trí cuối tập tin. Nếu tail
không thể tìm thấy kết thúc của tệp, nó không thể hiển thị các dòng X cuối cùng, vì "cuối cùng" không được xác định. Vậy tail
làm gì trong trường hợp này? Nó đợi cho đến khi tìm thấy phần cuối của tập tin.
Xem xét điều này:
$ chatter() { while :; do date; sleep 1; done; }
$ chatter | tail -f
Điều này không bao giờ xuất hiện để đạt được tiến bộ, bởi vì không bao giờ có một kết thúc rõ ràng của tập tin từ chatter
.
Bạn có hành vi tương tự nếu bạn yêu cầu tail
cung cấp cho bạn các dòng cuối cùng từ một ống hệ thống tệp. Xem xét:
$ mkfifo test.pipe
$ tail test.pipe
stdbuf
để giải quyết vấn đề nhận thức là một nỗ lực cao cả. Mặc dù vậy, thực tế quan trọng là bộ đệm I / O không phải là nguyên nhân gốc: việc thiếu một tập tin cuối xác định là. Nếu bạn kiểm tra mã nguồn tail.c , bạn sẽ thấy file_lines
chức năng bình luận:
END_POS là phần bù tệp của EOF (một phần lớn hơn phần bù của byte cuối cùng).
và đó là điều kỳ diệu. Bạn cần một phần cuối của tệp để đuôi hoạt động trong mọi cấu hình. head
không có hạn chế đó, nó chỉ cần một sự khởi đầu của tập tin (mà nó có thể không có, hãy thử head test.pipe
). Các công cụ định hướng luồng thích sed
và awk
không cần bắt đầu hay kết thúc tệp: chúng hoạt động trên bộ đệm.