Es geht nicht darum, am Ende einer Datei einen zusätzlichen Zeilenumbruch einzufügen, sondern darum, den Zeilenumbruch, der vorhanden sein sollte, nicht zu entfernen.
Eine Textdatei unter Unix besteht aus einer Reihe von Zeilen , die jeweils mit einem Zeilenumbruchzeichen ( \n
) enden . Eine Datei, die nicht leer ist und nicht mit einem Zeilenumbruch endet, ist daher keine Textdatei.
Dienstprogramme, die Textdateien verarbeiten sollen, kommen möglicherweise nicht mit Dateien zurecht, die nicht mit einem Zeilenumbruch enden. Beispielsweise können historische Unix-Dienstprogramme den Text nach dem letzten Zeilenumbruch ignorieren. GNU- Hilfsprogramme verhalten sich bei Nicht-Text-Dateien anständig, ebenso wie die meisten anderen modernen Hilfsprogramme. Es kann jedoch vorkommen, dass bei Dateien, denen eine letzte Zeile fehlt, ein ungewöhnliches Verhalten auftritt¹.
Wenn mit GNU diff eine der verglichenen Dateien mit einem Zeilenumbruch endet, die andere jedoch nicht, muss dies beachtet werden. Da diff zeilenorientiert ist, kann dies nicht durch Speichern einer neuen Zeile für eine der Dateien angezeigt werden, nicht jedoch für die anderen. Die neuen Zeilen sind erforderlich, um anzugeben, wo jede Zeile in der Diff-Datei beginnt und endet. Also verwendet diff diesen speziellen Text \ No newline at end of file
, um eine Datei, die nicht mit einem Zeilenumbruch endet, von einer Datei zu unterscheiden, die dies tat.
Übrigens besteht eine Quelldatei in einem C-Kontext in ähnlicher Weise aus einer Reihe von Zeilen. Genauer gesagt wird eine Übersetzungseinheit in einer Implementierung betrachtet, die als eine Reihe von Zeilen definiert ist, von denen jede mit einem Zeilenumbruchzeichen enden muss ( n1256 §5.1.1.1). Auf Unix-Systemen ist das Mapping einfach. Unter DOS und Windows wird jede CR LF-Sequenz ( \r\n
) einer neuen Zeile zugeordnet ( \n
dies geschieht immer, wenn eine Datei gelesen wird, die unter diesen Betriebssystemen als Text geöffnet wurde). Es gibt einige Betriebssysteme, die kein Zeilenumbruchzeichen haben, sondern Datensätze mit fester oder variabler Größe. Auf diesen Systemen führt die Zuordnung von Dateien zu C-Quellen ein\n
am Ende jeder Aufzeichnung. Dies ist zwar für Unix nicht direkt relevant, bedeutet aber, dass Sie beim Kopieren einer C-Quelldatei, deren letzte Zeile fehlt, auf ein System mit datensatzbasierten Textdateien und beim anschließenden Zurückkopieren eine unvollständige Datei erhalten Letzte Zeile, die bei der anfänglichen Konvertierung abgeschnitten wurde, oder eine zusätzliche Zeile, die bei der umgekehrten Konvertierung angeheftet wurde.
¹
Beispiel: Die Ausgabe von GNU sort endet immer mit einem Zeilenumbruch. Wenn der Datei foo
die letzte Zeile fehlt, werden Sie feststellen, dass sie sort foo | wc -c
ein Zeichen mehr als enthält cat foo | wc -c
.