Tu nie chodzi o dodanie nowej linii na końcu pliku, nie chodzi o usunięcie nowej linii, która powinna tam być.
Plik tekstowy , pod Uniksem, składa się z szeregu linii , z których każda kończy się znakiem nowej linii ( \n
). Plik, który nie jest pusty i nie kończy się na nowej linii, nie jest zatem plikiem tekstowym.
Narzędzia, które powinny działać na plikach tekstowych, mogą nie radzić sobie dobrze z plikami, które nie kończą się znakiem nowej linii; historyczne narzędzia uniksowe mogą na przykład ignorować tekst po ostatniej nowej linii. Programy narzędziowe GNU zachowują się przyzwoicie w przypadku plików nietekstowych, podobnie jak większość innych nowoczesnych programów narzędziowych, ale nadal możesz napotkać dziwne zachowanie w przypadku plików, które nie mają ostatniej nowej linii¹.
W przypadku GNU diff, jeśli jeden z porównywanych plików kończy się znakiem nowej linii, ale nie drugim, należy to zauważyć. Ponieważ diff jest zorientowany liniowo, nie może tego wskazać, przechowując nową linię dla jednego z plików, ale nie dla innych - nowe linie są konieczne do wskazania, gdzie każda linia w pliku diff zaczyna się i kończy. Tak więc diff używa tego specjalnego tekstu \ No newline at end of file
do odróżnienia pliku, który nie kończył się nową linią od pliku, który tak zrobił.
Nawiasem mówiąc, w kontekście C plik źródłowy podobnie składa się z szeregu linii. Mówiąc dokładniej, jednostka tłumacząca jest postrzegana w implementacji zdefiniowanej jako seria wierszy, z których każda musi kończyć się znakiem nowej linii ( n1256 §5.1.1.1). W systemach uniksowych mapowanie jest proste. W systemach DOS i Windows każda sekwencja CR LF ( \r\n
) jest odwzorowana na nową linię ( \n
; to zawsze dzieje się podczas odczytu pliku otwartego jako tekst w tych systemach operacyjnych). Istnieje kilka systemów operacyjnych, które nie mają znaku nowej linii, ale zamiast tego mają rekordy o stałej lub zmiennej wielkości; w tych systemach mapowanie plików do źródła C wprowadza\n
na końcu każdego rekordu. Chociaż nie ma to bezpośredniego związku z Uniksem, oznacza to, że jeśli skopiujesz plik źródłowy C, w którym brakuje jego ostatniej nowej linii, do systemu z plikami tekstowymi opartymi na rekordach, a następnie skopiujesz go z powrotem, albo skończysz z niekompletnym ostatnia linia została obcięta w początkowej konwersji lub dodatkowa nowa linia przyczepiona do niej podczas konwersji do tyłu.
¹
Przykład: wynik sortowania GNU zawsze kończy się nową linią. Więc jeśli w pliku foo
brakuje ostatniego nowego wiersza, zauważysz, że sort foo | wc -c
zgłasza on o jeden znak więcej niż cat foo | wc -c
.