sha256sum
bashスクリプトでファイルが変更されたことを確認するために使用します。私の考えは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 -e
false状態で終了すると、sha256sum --check
スクリプト全体が失敗します。これを防ぐには、runなどのすべての種類の条件にコマンドを入力してくださいsha256sum --check || true instead
。
また、言及したように、出力はファイルにリダイレクトされ、コマンドの置き換えにキャプチャする項目がなく、何があっても結果が空であるため、s1=$(sha256sum "$x" > "$x.sha256")
何か奇妙に見えます。必要でない場合は、コマンド置換を削除して出力を変数とファイルに保存するには、次のようなものを使用します。sha256sum
$s1
s1
sha256sum
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を設定)しても、期待どおりに機能しないのはなぜですか?