SHAが一致しないのはなぜですか?

SHAが一致しないのはなぜですか?

日付のSHAを使用するスクリプトを作成しようとしていますが、2つの異なる結果が表示され、生涯の間にその理由がわかりません。

echo -n 03112016 | cut -d'.' -f4 | sha256sum | cut -d' ' -f 1
482c00f7db8419d9f9a151d54de301d73c8f688b2e3e91c485f369596543612e

date "+%m%d%Y" | tr -d '\n' | sha256sum | cut -d' ' -f 1
d373ab72ec7d92ee06ebba4748f78829cd62ce68f1ac600ae1767a272869b664

私はこれが私がする愚かなことであることを知っていますが、助けてくれて本当にありがとう。

答え1

catテキスト(たとえば、、、、cutなどsort)を操作するように設計されたシェルユーティリティでは、入力はテキストファイルでtailなければなりません。 Unixの用語で表現されたテキストファイル:

  • LC_CTYPEヌルバイトを除いて、環境のロケール(ロケール)で有効な文字のみを含めます。
  • 一連の行で構成され、各行は\n改行文字(改行文字とも呼ばれます)で終わります。

2番目の点は、空でないファイルが改行文字で終わることを意味します。

入力がテキストファイルではない場合はどうなりますか?ユーティリティによって異なります。以前のUnixシステムは、ヌルバイトの次の行のテキストを無視し、最後の不完全行(最後の改行文字の後のテキスト)の全部または一部を無視する傾向がありました。 GNUバージョンは常にヌルバイトをプレーン文字として扱い、ほとんどの場合、無効なバイトシーケンスを渡します。 GNUバージョンは、最後の改行文字が失われても常に入力全体を処理しますが、出力に末尾の改行文字を追加するかどうかは異なります。たとえば、GNUはcat常に入力を変更せずに渡しますが、他の多くの場合(含む)はcut常にすべての出力行(最後の行を含む)の末尾に改行文字を印刷します。

したがって、参照入力を生成するときは、最後の瞬間に末尾の改行を抑制する必要があります。

echo 03112016 | cut -d'.' -f4 | tr -d '\n' | sha256sum

そうでなければ

echo -n 03112016 | sha256sum

関連情報