Bash
為什麼 sha256sum 對文件結束和輸入結束信號的處理方式不同?
我試圖為一個簡單的字元串計算 sha256,即“abc”。我發現像這樣使用sha256sum實用程序:
sha256sum file_with_string
給出與以下內容相同的結果:
sha256sum # enter, to read input from stdin abc ^D
即:
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb
請注意,在輸入結束信號之前,另一個換行符被饋送到標準輸入。
起初困擾我的是,當我決定使用線上校驗和計算器進行驗證時,結果有所不同:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
我認為這可能與我提供給 stdin 的第二個換行符有關,所以這次我嘗試插入 ^D 兩次(而不是使用換行符),結果如下:
abcba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
現在,這當然格式不好(由於缺少換行符),但除此之外,它與上面的匹配。
在那之後,我意識到我顯然無法理解 shell 中的輸入解析。我仔細檢查了我最初指定的文件中沒有多餘的換行符,那麼為什麼我會遇到這種行為?
不同之處在於換行符。
abc
首先,讓我們收集和的 sha256sumsabc\n
:$ printf 'abc\n' | sha256sum edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb - $ printf 'abc' | sha256sum ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad -
所以,
ba...ad
總和是針對字元串的abc
,而ed..cb
一個是針對的abc\n
。現在,如果你的文件給你ed..cb
輸出,這意味著你的文件有一個換行符。而且,鑑於“文本文件”需要一個尾隨換行符,如果您創建一個新文件,大多數編輯器都會為您添加一個。要獲取沒有換行符的文件,請使用上述
printf
方法。請注意file
,如果您的文件沒有換行符,將如何警告您:$ printf 'abc' > file $ file file file: ASCII text, with no line terminators
和
$ printf 'abc\n' > file2 $ file file2 file2: ASCII text
現在:
$ sha256sum file file2 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad file edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb file2