Đây không phải là thêm một dòng mới vào cuối tập tin, mà là về việc không xóa dòng mới sẽ có ở đó.
Một tệp văn bản , dưới unix, bao gồm một loạt các dòng , mỗi dòng kết thúc bằng một ký tự dòng mới ( \n
). Do đó, một tệp không trống và không kết thúc bằng một dòng mới không phải là một tệp văn bản.
Các tiện ích được cho là hoạt động trên các tệp văn bản có thể không phù hợp với các tệp không kết thúc bằng một dòng mới; các tiện ích Unix lịch sử có thể bỏ qua văn bản sau dòng mới nhất, ví dụ. Các tiện ích GNU có chính sách ứng xử khéo léo với các tệp không phải là văn bản và hầu hết các tiện ích hiện đại khác cũng vậy, nhưng bạn vẫn có thể gặp phải hành vi kỳ lạ với các tệp bị thiếu một dòng mới cuối cùng¹.
Với GNU diff, nếu một trong các tệp được so sánh kết thúc bằng một dòng mới nhưng không phải là tệp khác, thì cần lưu ý thực tế đó. Vì diff được định hướng theo dòng, nên nó không thể chỉ ra điều này bằng cách lưu trữ một dòng mới cho một trong các tệp nhưng không phải cho các tệp khác - các dòng mới là cần thiết để chỉ ra nơi mỗi dòng trong tệp diff bắt đầu và kết thúc. Vì vậy, diff sử dụng văn bản đặc biệt này \ No newline at end of file
để phân biệt một tệp không kết thúc trong một dòng mới với một tệp đã làm.
Nhân tiện, trong ngữ cảnh C, một tệp nguồn tương tự bao gồm một loạt các dòng. Chính xác hơn, một đơn vị dịch thuật được xem trong một triển khai - được định nghĩa là một chuỗi các dòng, mỗi dòng phải kết thúc bằng một ký tự dòng mới ( n1256 §5.1.1.1). Trên các hệ thống unix, ánh xạ rất đơn giản. Trên DOS và Windows, mỗi chuỗi CR LF ( \r\n
) được ánh xạ tới một dòng mới ( \n
; đây là điều luôn xảy ra khi đọc tệp được mở dưới dạng văn bản trên các HĐH này). Có một số HĐH không có ký tự dòng mới, nhưng thay vào đó có các bản ghi có kích thước cố định hoặc có thể thay đổi; trên các hệ thống này, ánh xạ từ tệp đến nguồn C giới thiệu một\n
vào cuối mỗi bản ghi. Mặc dù điều này không liên quan trực tiếp đến unix, nhưng điều đó có nghĩa là nếu bạn sao chép tệp nguồn C thiếu dòng mới cuối cùng của nó sang hệ thống có tệp văn bản dựa trên bản ghi, sau đó sao chép lại, bạn sẽ kết thúc với phần chưa hoàn chỉnh dòng cuối cùng bị cắt bớt trong chuyển đổi ban đầu hoặc một dòng mới bổ sung được xử lý trong quá trình chuyển đổi ngược lại.
¹
Ví dụ: đầu ra của GNU loại luôn luôn kết thúc bằng một dòng mới. Vì vậy, nếu tệp foo
bị thiếu dòng mới cuối cùng, bạn sẽ thấy sort foo | wc -c
báo cáo có nhiều ký tự hơn cat foo | wc -c
.