为什么写入文件会更改内容(哈希)?

Why does writing to file change the content (hash)?

我注意到,在使用 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

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

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

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

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