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!
tailhiển thị các dòng X cuối cùng. tail -fthự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ó, tailphải có khả năng xác định vị trí cuối tập tin. Nếu tailkhô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 taillà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 tailcung 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_lineschứ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. headkhô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 sedvà awkkhông cần bắt đầu hay kết thúc tệp: chúng hoạt động trên bộ đệm.