Bashスクリプトでファイルハッシュを比較するには?

Bashスクリプトでファイルハッシュを比較するには?

sha256sumbashスクリプトでファイルが変更されたことを確認するために使用します。私の考えはsha256sum最初にファイルに保存することです*.sha256。次に、存在する場合はコマンドを使用して比較にsha256使用します--check。ハッシュが一致する場合は残りのスクリプトを続行し、そうでない場合は新しいハッシュファイル(*.sha256)を作成し、古いハッシュファイルを新しいファイルに置き換えます。私はすでにこれを行いました。

x="/home/test.json"

if [[ -s $x.sha256 ]]; then
        sha256sum --check $x.sha256
        #exit 1
        s1=$(sha256sum "$x" > "$x.sha256")
        #exit 1
else
        s1=$(sha256sum "$x" > "$x.sha256")
        echo "sha256 file is created"
fi

しかし、上記のコードからx.sha256ファイルが存在しない場合は生成されます。ただし、ファイルがすでに使用可能でハッシュが一致しない場合、エラーが発生します。

/home/test.json: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

これは予想されるものですが、この場合は新しいファイルを作成して古いファイルを置き換えたいと思いますx.sha256

どのような変更が必要かを教えてくれる人はいますか?

事前にありがとう

答え1

コメントから:

しかし、スクリプトはset -Eeo pipefail

set -efalse状態で終了すると、sha256sum --checkスクリプト全体が失敗します。これを防ぐには、runなどのすべての種類の条件にコマンドを入力してくださいsha256sum --check || true instead

また、言及したように、出力はファイルにリダイレクトされ、コマンドの置き換えにキャプチャする項目がなく、何があっても結果が空であるため、s1=$(sha256sum "$x" > "$x.sha256")何か奇妙に見えます。必要でない場合は、コマンド置換を削除して出力を変数とファイルに保存するには、次のようなものを使用します。sha256sum$s1s1sha256sum

s1=$(sha256sum "$x" | tee "$x.sha256")

だから、スクリプト全体を次のように書き直します。

#!/bin/bash

set -e
file="/home/test.json"

if [[ -s $file.sha256 ]]; then
    if ! sha256sum --check "$file.sha256"; then
        echo "stored hash for '$file' does not match existing file, storing new hash"
        sha256sum "$file" > "$file.sha256"
    else
        : # hash file exists and matches existing file, do nothing
    fi
else
    echo "no stored hash for '$file', creating hash file"
    sha256sum "$file" > "$file.sha256"
fi

つまり、ファイルにハッシュの追加コピーが必要ない限り、この場合は既存の一致ハッシュブランチでも読み取る必要があります"$file.sha256"

しかし、あなたがset -e使用している場合BashFAQ / 105 - -eを設定(または-o errexitまたはトラップERRを設定)しても、期待どおりに機能しないのはなぜですか?

関連情報