Non si tratta di aggiungere una nuova riga alla fine di un file, non si tratta di rimuovere la nuova riga che dovrebbe essere lì.
Un file di testo , in unix, è costituito da una serie di righe , ciascuna delle quali termina con un carattere di nuova riga ( \n
). Un file che non è vuoto e non termina con una nuova riga non è quindi un file di testo.
Le utility che dovrebbero funzionare su file di testo potrebbero non far fronte bene ai file che non terminano con una nuova riga; i programmi di utilità storici Unix potrebbero ignorare il testo dopo l'ultima riga, ad esempio. Le utility GNU hanno una politica di comportamento decente con i file non di testo, così come la maggior parte delle altre utility moderne, ma potresti comunque riscontrare un comportamento strano con i file che mancano di una nuova riga finale¹.
Con GNU diff, se uno dei file confrontati termina con una nuova riga ma non con l'altro, è importante notare questo fatto. Poiché diff è orientato alla linea, non può indicarlo memorizzando una nuova riga per uno dei file ma non per gli altri - le nuove righe sono necessarie per indicare dove ogni riga nel file diff inizia e finisce. Quindi diff usa questo testo speciale \ No newline at end of file
per differenziare un file che non è finito in una nuova riga da un file che lo ha fatto.
A proposito, in un contesto C, un file sorgente è similmente formato da una serie di linee. Più precisamente, un'unità di traduzione viene visualizzata in un'implementazione definita come una serie di righe, ognuna delle quali deve terminare con un carattere di nuova riga ( n1256 §5.1.1.1). Sui sistemi unix, la mappatura è semplice. Su DOS e Windows, ogni sequenza CR LF ( \r\n
) è mappata su una nuova riga ( \n
; questo è ciò che accade sempre quando si legge un file aperto come testo su questi sistemi operativi). Ci sono alcuni sistemi operativi là fuori che non hanno un carattere di nuova riga, ma invece hanno record di dimensioni fisse o variabili; su questi sistemi, la mappatura dai file alla sorgente C introduce a\n
alla fine di ogni record. Anche se questo non è direttamente rilevante per unix, significa che se copi un file sorgente C in cui manca la sua nuova riga finale in un sistema con file di testo basati su record, quindi copiarlo indietro, finirai con l'incompleto ultima linea troncata nella conversione iniziale o una nuova riga aggiuntiva attaccata su di essa durante la conversione inversa.
¹
Esempio: l'output dell'ordinamento GNU termina sempre con una nuova riga. Quindi se nel file foo
manca la sua nuova riga finale, scoprirai che sort foo | wc -c
riporta un carattere in più di cat foo | wc -c
.