Мова не йде про додавання додаткового нового рядка в кінці файлу, це не про видалення нового рядка, який повинен бути там.
Текстовий файл під UNIX, складається з ряду ліній , кожна з яких закінчується з нового рядка ( \n
). Файл, який не порожній і не закінчується новим рядком, тому не є текстовим файлом.
Утиліти, які повинні працювати над текстовими файлами, можуть не впоратися з файлами, які не закінчуються новим рядком; Наприклад, історичні утиліти Unix можуть ігнорувати текст після останнього нового рядка. Утиліти GNU мають політику пристойного поводження з нетекстовими файлами, як і більшість інших сучасних утиліт, але ви все ще можете стикатися з дивною поведінкою з файлами, у яких відсутній остаточний новий рядок¹.
Якщо GNU відрізняється, якщо один із файлів, що порівнюються, закінчується новим рядком, а не інший, слід обережно зазначити цей факт. Оскільки diff є орієнтованим на рядки, він не може вказати це, зберігаючи новий рядок для одного з файлів, але не для інших - в нових рядках необхідно вказати, де починається і закінчується кожен рядок у файлі diff . Так diff використовує цей спеціальний текст \ No newline at end of file
для розмежування файлу, який не закінчився в новому рядку від файлу, який був.
До речі, у контексті С вихідний файл аналогічно складається із серії рядків. Точніше, блок перекладу розглядається у реалізації, визначеному як серія рядків, кожен з яких повинен закінчуватися символом нового рядка ( n1256 §5.1.1.1). У системах Unix відображення прямолінійне. У DOS та Windows кожна послідовність CR LF ( \r\n
) відображається у новому рядку ( \n
це завжди відбувається під час читання файлу, відкритого як текст на цих ОС). Є кілька ОС, які не мають символу нового рядка, а натомість мають записи фіксованого чи змінного розміру; для цих систем відображення від файлів до джерела С вводить a\n
в кінці кожного запису. Хоча це не має безпосереднього відношення до unix, це означає, що якщо ви скопіюєте вихідний файл C, у якого відсутній його остаточний рядок, в систему з текстовими файлами на основі записів, а потім скопіюйте його назад, ви або закінчитеся з неповним останній рядок, урізаний у початковій конверсії, або додатковий новий рядок, накреслений на ньому під час зворотного перетворення.
¹
Приклад: вихід сортування GNU завжди закінчується новим рядком. Отже, якщо у файлі foo
відсутній остаточний новий рядок, ви побачите, що sort foo | wc -c
повідомляє ще один символ cat foo | wc -c
.