这不是在文件末尾添加额外的换行符,而是关于不删除应存在的换行符。
Unix下的文本文件由一系列行组成,每行以换行符(\n
)结尾。因此,不为空且不以换行符结尾的文件不是文本文件。
本应在文本文件上运行的实用程序可能无法很好地应对不以换行符结尾的文件。例如,历史上的Unix实用程序可能会忽略最后一个换行符之后的文本。GNU实用程序具有对非文本文件进行适当处理的策略,大多数其他现代实用程序也是如此,但是对于缺少最后一个换行符的文件,您仍然可能会遇到奇怪的行为。
使用GNU diff,如果要比较的文件之一以换行符结尾而不是换行符结尾,则请注意该事实。由于diff是面向行的,因此无法通过为其中一个文件存储换行符(而不为其他文件存储换行符)来表明这一点-换行符对于指示diff文件中每一行的开始和结束位置是必需的。因此,diff使用此特殊文本\ No newline at end of file
将未以换行结尾的文件与已换行的文件区分开。
顺便说一下,在C上下文中,源文件类似地由一系列行组成。更准确地说,一个翻译单元是在观看实现定义为一系列线,其每一个必须以换行字符(结束的n1256 §5.1.1.1)。在UNIX系统上,映射很简单。在DOS和Windows上,每个CR LF序列(\r\n
)都映射到换行符(\n
;这是在这些OS上读取以文本形式打开的文件时总是发生的情况。有些操作系统没有换行符,而是有固定大小或可变大小的记录。在这些系统上,从文件到C源代码的映射引入了\n
在每条记录的末尾。虽然这与unix并不直接相关,但这确实意味着,如果将缺少最终换行符的C源文件复制到具有基于记录的文本文件的系统中,然后再将其复制回,则结果要么不完整最后一行在初始转换中被截断,或者在反向转换期间附加了一个新行。
¹
示例:GNU sort的输出始终以换行符结尾。因此,如果文件foo
缺少最后一个换行符,则会发现sort foo | wc -c
报告的字符比少一个cat foo | wc -c
。