Il ne s'agit pas d'ajouter une nouvelle ligne à la fin d'un fichier, mais de ne pas supprimer la nouvelle ligne qui devrait y figurer.
Un fichier texte , sous unix, consiste en une série de lignes , chacune d’elles se terminant par un caractère de nouvelle ligne ( \n
). Un fichier qui n'est pas vide et qui ne se termine pas par une nouvelle ligne n'est donc pas un fichier texte.
Les utilitaires censés fonctionner sur des fichiers texte risquent de ne pas bien gérer les fichiers ne se terminant pas par une nouvelle ligne; Par exemple, les utilitaires Unix historiques peuvent ignorer le texte après la dernière nouvelle ligne. Les utilitaires GNU ont pour politique de se comporter convenablement avec les fichiers non textuels, comme la plupart des utilitaires modernes, mais vous pouvez toujours rencontrer un comportement étrange avec des fichiers pour lesquels il manque une nouvelle ligne¹.
Avec GNU diff, si l’un des fichiers comparés se termine par une nouvelle ligne mais pas l’autre, il convient de noter ce fait. Comme diff est orienté ligne, il ne peut pas indiquer cela en stockant une nouvelle ligne pour l'un des fichiers mais pas pour les autres; les nouvelles lignes sont nécessaires pour indiquer où chaque ligne du fichier diff commence et se termine. So diff utilise ce texte spécial \ No newline at end of file
pour différencier un fichier ne se terminant pas par un retour à la ligne.
À propos, dans un contexte C, un fichier source est constitué d’une série de lignes. Plus précisément, une unité de traduction est vue dans une implémentation définie comme une série de lignes, dont chacune doit se terminer par un caractère de nouvelle ligne ( n1256 §5.1.1.1). Sur les systèmes Unix, le mappage est simple. Sous DOS et Windows, chaque séquence CR LF ( \r\n
) est mappée sur une nouvelle ligne ( \n
c'est toujours ce qui se produit lors de la lecture d'un fichier ouvert sous forme de texte sur ces systèmes d'exploitation). Il existe quelques systèmes d'exploitation qui n'ont pas de caractère de nouvelle ligne, mais ont plutôt des enregistrements de taille fixe ou variable; sur ces systèmes, le mappage des fichiers vers la source C introduit un\n
à la fin de chaque enregistrement. Bien que cela ne concerne pas directement les systèmes Unix, cela signifie que si vous copiez un fichier source C dont le saut de ligne final est manquant sur un système contenant des fichiers texte basés sur des enregistrements, puis que vous le recopiez, vous obtiendrez le fichier incomplet. dernière ligne tronquée lors de la conversion initiale ou ajout d’une nouvelle ligne lors de la conversion inverse.
¹
Exemple: la sortie du tri GNU se termine toujours par une nouvelle ligne. Ainsi, si le fichier foo
manque sa nouvelle ligne finale, vous constaterez qu'il sort foo | wc -c
indique un caractère de plus que cat foo | wc -c
.