No se trata de agregar una nueva línea adicional al final de un archivo, se trata de no eliminar la nueva línea que debería estar allí.
Un archivo de texto , bajo unix, consta de una serie de líneas , cada una de las cuales termina con un carácter de nueva línea ( \n
). Por lo tanto, un archivo que no está vacío y no termina con una nueva línea no es un archivo de texto.
Las utilidades que se supone que operan en archivos de texto pueden no funcionar bien con archivos que no terminan con una nueva línea; Las utilidades históricas de Unix pueden ignorar el texto después de la última línea nueva, por ejemplo. Las utilidades de GNU tienen una política de comportarse decentemente con archivos que no son de texto, al igual que la mayoría de las otras utilidades modernas, pero aún puede encontrar comportamientos extraños con los archivos a los que les falta una nueva línea final¹.
Con GNU diff, si uno de los archivos que se comparan termina con una nueva línea pero no con el otro, es importante tener en cuenta ese hecho. Dado que diff está orientado a líneas, no puede indicar esto almacenando una nueva línea para uno de los archivos, pero no para los demás; las nuevas líneas son necesarias para indicar dónde comienza y termina cada línea en el archivo diff . Así que diff usa este texto especial \ No newline at end of file
para diferenciar un archivo que no terminó en una nueva línea de un archivo que sí lo hizo.
Por cierto, en un contexto C, un archivo fuente de manera similar consiste en una serie de líneas. Más precisamente, una unidad de traducción se ve en una implementación definida como una serie de líneas, cada una de las cuales debe terminar con un carácter de nueva línea ( n1256 §5.1.1.1). En sistemas unix, el mapeo es sencillo. En DOS y Windows, cada secuencia CR LF ( \r\n
) se asigna a una nueva línea ( \n
; esto es lo que siempre sucede cuando se lee un archivo abierto como texto en estos sistemas operativos). Existen algunos sistemas operativos que no tienen un carácter de nueva línea, sino que tienen registros de tamaño fijo o variable; En estos sistemas, la asignación de archivos a la fuente C introduce un\n
al final de cada registro. Si bien esto no es directamente relevante para Unix, significa que si copia un archivo fuente C que falta su nueva línea final en un sistema con archivos de texto basados en registros, luego cópielo de nuevo, o terminará con el archivo incompleto última línea truncada en la conversión inicial, o una nueva línea adicional añadida durante la conversión inversa.
¹
Ejemplo: la salida del ordenamiento GNU siempre termina con una nueva línea. Entonces, si al archivo foo
le falta su nueva línea final, encontrará que sort foo | wc -c
informa un carácter más que cat foo | wc -c
.