sha256sumがファイルエンド信号と入力エンド信号を異なる方法で処理するのはなぜですか?

sha256sumがファイルエンド信号と入力エンド信号を異なる方法で処理するのはなぜですか?

単純な文字列、つまり「abc」のsha256を計算しようとしています。私は使用して発見しましたシャー256島次のユーティリティ:

sha256sum file_with_string

次の結果を提供します。

sha256sum # enter, to read input from stdin
abc
^D

今すぐ:

edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

終了信号が入力される前に、別の改行文字が標準入力に提供されることに注意してください。


最初に私を悩ませたのは、オンラインチェックサム電卓を使用してこれを確認することにしたときに結果が違っていたということです。

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

私の考えでは、これは私がstdinに入力した2番目の改行文字に関連しているようです。だから今回は^Dを2回挿入してみました(改行文字の代わりに)。結果は次のとおりです。

abcba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

もちろん、フォーマットが間違っていますが(改行がないため)、それ以外は上記と一致します。

後で、私はシェルの入力解析について明らかに理解していないことに気づきました。慎重に確認してみると、追加事項はありません新しいチームもともと指定したファイルにありますが、なぜこのような問題が発生しますか?

答え1

違いは改行文字です。まず、abcsha256sumsの合計を収集しますabc\n

$ printf 'abc\n' | sha256sum 
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb  -
$ printf 'abc' | sha256sum 
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad  -

したがって、ba...ad合計は文字列のもので、abc1ed..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

答え2

sha256sum # enter, to read input from stdin
abc
^D

だから^D今回は(新しい行を使用する代わりに)2回挿入しようとしました。

ttyで^D()を押すとVEOF正式モード(すべてのコマンドラインウィンドウ、xtermなどのデフォルト)、ターミナルドライバ(「行ルール」)は、改行文字を待たずにすぐにバッファリングされたデータをttyから読み取るプロセスに使用できるようにします。

と入力するとabc、後ろの文字列が読み込まれ(つまり、次に終わる)、後ろの空の文字列(つまり、サイズが0のコンテンツが読み込まれます)がファイルの終わりとして解釈されます。<newline>^Dsha256sum"abc\x0a"LF<newline>""^Dsha256sum

と入力するabc^D 二重、最初の文字列の後の文字列を読み取り、sha256sum2番目の文字列の後の空の文字列をもう一度読みます。"abc"^D""^D

したがって、前者の場合、出力に追加の改行文字が含まれ、チェックサムがsha256sum異なります。

通常のファイルの場合、sha256sum到達するまで読み取りが続きます。ファイルの終わり、ここで上記の2つの場合にのみ、読み取りは空の文字列を返します。sha256入力が端末なのか、パイプなのか、普通のファイルなのか、まったくわからない状況も似ています。

関連情報