为什么写入文件会更改内容(哈希)?
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
我还注意到,在使用 cat
或 head
时,如果不打开文件并写出,我看不到输出。编码是否更改?
大多数文本编辑器,包括 Vim,在您退出时会在末尾添加一个换行符来保存文件。这是因为根据 POSIX,文本文件要么是空的,要么以换行符结尾,因此大多数用户都期望并想要这种行为。
正如您所注意到的,在末尾添加一个换行符会更改散列,并且您获得的散列与序列 foo\n
一致,其中 \n
是一个换行符。
如果你有一个足够新的 Vim,你可以通过设置 nofixeol
来控制上面提到的行为,这将保留最后一行的现有行尾,或缺少行尾。
我注意到,在使用 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
来控制上面提到的行为,这将保留最后一行的现有行尾,或缺少行尾。