ファイルの最後に余分な改行を追加することではなく、そこにあるはずの改行を削除しないことです。
UNIXの下のテキストファイルは一連の行で構成され、各行は改行文字(\n
)で終わります。したがって、空ではなく、改行で終わらないファイルはテキストファイルではありません。
テキストファイルで動作するはずのユーティリティは、改行で終わらないファイルにうまく対応できない場合があります。たとえば、歴史的なUnixユーティリティは、最後の改行の後のテキストを無視する場合があります。GNUユーティリティには、非テキストファイルで適切に動作するポリシーがあり、他のほとんどの最新ユーティリティも同様ですが、最後の改行が欠落しているファイルで奇妙な動作が発生する場合があります¹。
GNU diffでは、比較対象のファイルの1つが改行で終わっていて、もう1つが終わっていない場合、その事実に注意するよう注意してください。diffが行指向であるので、それは他人のためのいずれかのファイルではなく、ために改行を格納することで、これを示すことはできません-改行は場所を示すために必要な各ラインdiffファイルの中に開始および終了。そのため、diffはこの特別なテキスト\ No newline at end of file
を使用して、改行で終わっていないファイルと改行で終わっているファイルを区別します。
ところで、Cコンテキストでは、ソースファイルも同様に一連の行で構成されます。より正確には、変換部は、実装定義の一連のラインとして、改行文字(で終わる必要がありその各々に見たn1256 §5.1.1.1)。UNIXシステムでは、マッピングは簡単です。DOSおよびWindowsでは、各CR LFシーケンス(\r\n
)は改行にマッピングされます(\n
;これは、これらのOSでテキストとして開かれたファイルを読み取るときに常に発生します)。改行文字を持たず、代わりに固定サイズまたは可変サイズのレコードを持つOSがいくつかあります。これらのシステムでは、ファイルからCソースへのマッピングにより、\n
各レコードの最後。これはUNIXには直接関係ありませんが、最終的な改行がないCソースファイルをレコードベースのテキストファイルがあるシステムにコピーし、それをコピーして戻すと、不完全になってしまうことを意味します最初の変換で切り捨てられた最後の行、または逆変換中に余分な改行が追加されます。
¹
例:GNU sortの出力は常に改行で終わります。そのため、ファイルのfoo
最後の改行が欠落している場合、それsort foo | wc -c
は1つ以上の文字を報告することがわかりますcat foo | wc -c
。