我假设这里的每个人都熟悉所有文本文件都应该以换行符结尾的格言。我已经知道这个“规则”很多年了,但我一直想知道——为什么?
因为这就是POSIX 标准定义一行的方式:
3.206线 零个或多个非 字符加上终止 字符的序列。
零个或多个非 字符加上终止 字符的序列。
因此,不以换行符结尾的行不被视为实际行。这就是为什么某些程序在处理文件的最后一行时遇到问题的原因,如果它不是换行符终止的话。
在终端仿真器上工作时,该指南至少有一个硬性优势:所有 Unix 工具都期望这个约定并使用它。例如,当使用 连接文件时cat,由换行符终止的文件将与没有的文件具有不同的效果:
cat
$ more a.txt foo $ more b.txt bar$ more c.txt baz $ cat {a,b,c}.txt foo barbaz
而且,正如前面的示例还演示的那样,当在命令行上显示文件时(例如 via more),换行符终止的文件会导致正确的显示。不正确终止的文件可能会出现乱码(第二行)。
more
为了保持一致性,遵循这条规则非常有帮助——否则在处理默认的 Unix 工具时会产生额外的工作。
换个角度想一想:如果行没有被换行符终止,那么使诸如cat有用的命令变得更加困难:您如何创建命令来连接文件,使得
b.txt
c.txt
当然这是可以解决的,但是您需要使使用cat更复杂(通过添加位置命令行参数,例如cat a.txt --no-newline b.txt c.txt),现在命令而不是每个单独的文件控制它与其他文件的粘贴方式。这几乎肯定不方便。
cat a.txt --no-newline b.txt c.txt
… 或者您需要引入一个特殊的标记字符来标记应该继续而不是终止的行。好吧,现在您遇到了与 POSIX 相同的情况,除了反转(行继续而不是行终止字符)。