Vim 为什么写入文件会更改内容(散列)?

Vim 为什么写入文件会更改内容(散列)?,vim,hash,echo,nano,Vim,Hash,Echo,Nano,我注意到,在用vim复制粘贴到一个文件中之后,当试图生成一些散列时,散列并不像预期的那样。打开并写出文件时也是如此。nano也有同样的行为,所以我一定是弄错了什么 $ echo -n "foo" | openssl dgst -sha256 2c26...e7ae $ echo -n "foo" > hash.txt $ openssl dgst -sha256 hash.txt SHA256(hash.txt)= 2c26...e7ae 但是,当我用nano或vim打开hash.tx

我注意到,在用vim复制粘贴到一个文件中之后,当试图生成一些散列时,散列并不像预期的那样。打开并写出文件时也是如此。nano也有同样的行为,所以我一定是弄错了什么

$ echo -n  "foo" | openssl dgst -sha256
2c26...e7ae
$ echo -n "foo" > hash.txt
$ openssl dgst -sha256 hash.txt
SHA256(hash.txt)= 2c26...e7ae
但是,当我用nano或vim打开hash.txt并退出而不插入任何内容时,我随后得到以下哈希:
b5bb…944c


我还注意到,在使用
cat
head
时,如果不打开文件并写出来,我就看不到输出。编码是否已更改?

大多数文本编辑器(包括Vim)在退出时,都会在文件末尾使用换行符保存文件。这是因为根据POSIX,文本文件要么是空的,要么以换行符结尾,所以大多数用户期望并想要这种行为

正如您所注意到的,在末尾添加一个换行符会更改哈希值,并且您得到的哈希值与序列
foo\n
一致,其中
\n
是一个换行符


如果您有一个足够新的Vim,您可以通过设置
nofixeol
来控制上述行为,这将在最后一行保留现有的行尾或缺少行尾。

不知何故,您在文件中插入了新行。无论如何,我无法复制您的结果。
echo foo | openssl dgst-sha256
=>b5bb…4944c。这是相同的带有新行的
foo