问题起源
ArchStacker遇到一个很神奇的问题:cat输出文件时会在末尾自动加上换行吗?
在IRC上收到这条消息后,我自己测试了一下发现cat不会自动加换行。后面测试编辑器时发现是VIM/nano自动加上的换行。
虽然用VIM编辑的时候并不能看出末尾有一行空行。但是用hexdump命令以十六进制方式查看时,发现总是多出一个0x0a。于是误以为cat会给文件末尾加上换行。实际上是编辑器给自动加上的。
文本每行都应该换行
“根据2011年ISO发布的C语言标准C11(ISO/IEC 9899:2011)和C++标准C++11(ISO/IEC 14882:2011),每行末尾都应该换行。”
另外一致的行尾换行,有利于命令行工具的协同工作。
比如合并两个文本文档,简单地用cat file1 file2 > result即可。但这是因为每行都有换行结尾。否则还得想办法给两文档之间插入换行。
再如简单地给文本末尾加上一行,是简单的echo somethingnew >> file呢,还是echo -e '\n' >> file; echo somethingnew >> file 呢?
kandu@#ubuntu-cn曰: “因为unix并没有一个真实的 eof 字符存在。若一个处理文本流的daemon不断接受字符串。它是等到\n才进行处理。你若写个程序将一个未用\n结尾的文本全部喂给 daemon, daemon 没看到 \n 就不知道最后一行是已经结束了。unix 界有约定文本最后一行要\n。 ”
感觉在Windows GUI环境完全不用关心这些琐事。而严重依赖于文本的UNIX环境却对每行文本是否必须得有EOL结尾都斤斤计较。
第一次注意到“文本每行都应该换行”这个约定(convention)。
参考文献
Linux下vi编辑过的文件末尾都有换行符:换行符() 相当于ASCII 换行字符(十六进制0A) [
http://justwinit.cn/post/3516/ ]
文本每行都应该换行——vi文件末尾自动换行,不会导致php输出空行
[ http://www..com/sink_cup/archive/2012/08/17/vi_php_eol_tab_space.html
]
Why should files end with a newline? [
http://stackoverflow.com/questions/729692/why-should-files-end-with-a-newline ]