pupuk / blog

My New Blog. Record & Share. Focus on PHP, MySQL, Javascript and Golang.
MIT License
9 stars 2 forks source link

vi, vim 为什么会在文件末尾追加一个换行符\n #9

Open pupuk opened 6 years ago

pupuk commented 6 years ago

比如有一个文件,sample.txt 里面的文本内容是一个字符(a后面没有换行符\n):a

cat sample.txt 
a#

然后我们 vi sample.txt,不做任何操作,直接:wq保存退出,再查看文件

cat sample.txt
a

观察结果,第一个结果,a后面直接跟了一个#

stat查看第一个文件,size是1个字节

stat sample.txt 
  File: ‘sample.txt’
  Size: 1           Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d    Inode: 667449      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-08-22 09:35:34.519010275 +0800
Modify: 2018-08-22 09:35:34.519010275 +0800
Change: 2018-08-22 09:35:34.519010275 +0800
 Birth: -

vim以后,是2个字节

stat sample.txt
  File: ‘sample.txt’
  Size: 2           Blocks: 8          IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 667449      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-08-22 09:37:53.473372228 +0800
Modify: 2018-08-22 09:37:53.473372228 +0800
Change: 2018-08-22 09:37:53.477372383 +0800
 Birth: -

同理用md5sum,也能发现两个文件内容的不同

md5sum sample.txt vi之前 0cc175b9c0f1b6a831c399e269772661 sample.txt vi之后 60b725f10c9c85c70d97880dfe8191b3 sample.txt

其内容的差异就是vi,和vim会默认在没有以\n结束的非空文本文件,追加一个\n 那为什么vi和vim要这么处理呢? 搜索查阅资料 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206

A sequence of zero or more non- characters plus a terminating character.

后来C+11以后,也要求cpp文件必须以\n结束,否则编译会报warn: "no newline at end of file" http://gcc.gnu.org/ml/gcc/2003-11/msg01568.html

可以说POSIX标准(对操作系统(准确地说是针对类Unix操作系统)的标准化协议)这样制定了,然后编程语言(c,cpp)和一些应用(vi,vim)等按照标准来这样处理,我们的问题是为什么POSIX标准会这样建议或者说这样制定呢? 其实很多的协议标准指定,也是根据普遍情况做一些取舍。我个人还是喜欢这种默认加\n的。 Linux的 >和>>, 也会在文件末尾补上\n。