我想这里的每个人都熟悉这句谚语,即所有文本文件都应该以换行符结尾。我已经知道这个“规则”很多年了,但我一直在想——为什么?
当前回答
最后缺少换行符的文件还有一个实际的编程问题:read-Bash内置(我不知道其他read实现)无法按预期工作:
printf $'foo\nbar' | while read line
do
echo $line
done
这只打印foo!原因是,当read遇到最后一行时,它将内容写入$line,但返回退出代码1,因为它已到达EOF。这打破了while循环,因此我们永远无法到达echo$line部分。如果要处理这种情况,必须执行以下操作:
while read line || [ -n "${line-}" ]
do
echo $line
done < <(printf $'foo\nbar')
也就是说,如果由于文件末尾的非空行导致读取失败,则执行回显。当然,在这种情况下,输出中将有一个额外的换行符,而输入中没有。
其他回答
一个单独的用例:当文本文件受版本控制时,提交卫生。
如果将内容添加到文件末尾,则先前是最后一行的行将被编辑为包含换行符。这意味着,打开文件以了解该行最后一次编辑的时间将显示换行符添加,而不是您实际希望看到的提交。
(该示例特定于git,但同样的方法也适用于其他版本控制系统。)
我个人喜欢源代码文件末尾的新行。
它可能起源于Linux或所有UNIX系统。我记得有编译错误(如果我没弄错的话是gcc),因为源代码文件没有以空的新行结尾。为什么会这样呢。
这可能与以下两者之间的差异有关:
文本文件(每行应该以行尾结尾)二进制文件(没有真正的“行”可言,必须保留文件的长度)
如果每一行都以行尾结尾,这就避免了,例如,连接两个文本文件会使第一行的最后一行与第二行的第一行对齐。
此外,编辑器可以在加载时检查文件是否以行尾结尾,将其保存在本地选项“eol”中,并在写入文件时使用该选项。
几年前(2005年),许多编辑(ZDE、Eclipse、Scite…)确实“忘记”了最后的EOL,这并不是很受欢迎。不仅如此,他们还错误地将最后的EOL解释为“开始一行”,实际上开始显示另一行,就好像它已经存在一样。与在上述编辑器之一中打开文本文件相比,这在“适当”的文本文件中是非常明显的,该文件具有良好的文本编辑器(如vim)。它在文件的最后一行下面显示了一行。你会看到这样的情况:
1 first line
2 middle line
3 last line
4
这源于使用简单终端的早期。换行符用于触发传输数据的“刷新”。
今天,不再需要换行符。当然,如果没有换行符,许多应用程序仍然存在问题,但我认为这是这些应用程序中的一个错误。
然而,如果你有一个需要换行符的文本文件格式,那么你可以得到非常便宜的简单数据验证:如果文件以结尾没有换行符的行结尾,那么你就知道文件已损坏。每行只有一个额外的字节,您可以高精度地检测损坏的文件,几乎不需要CPU时间。
基本上,如果没有得到最终EOL EOF,许多程序将无法正确处理文件。
GCC警告您这一点,因为它是C标准的一部分。(第5.1.1.2节明显)
“文件末尾没有换行符”编译器警告
推荐文章
- 如何生成一个核心转储在Linux上的分段错误?
- 在Python中如何在Linux和Windows中使用“/”(目录分隔符)?
- 使用sh shell比较字符串
- 从包含文件名的路径获取不包含文件名的完整路径
- Visual Studio代码-在文件末尾插入换行符
- 只列出UNIX中的目录
- Git:从另一个分支复制目录中的所有文件
- PHP,获取没有文件扩展名的文件名
- 如何限制从grep返回的结果的数量?
- 如何管道列表的文件返回的找到命令到猫查看所有文件
- 以相对于当前目录的路径递归地在Linux CLI中列出文件
- 如何使用xargs复制名称中有空格和引号的文件?
- 如何在远程系统上使用Ansible任务移动/重命名文件
- 在makefile中抑制命令调用的回声?
- Shell脚本for循环语法