cmpが期待どおりに機能しない

cmpが期待どおりに機能しない

おそらく何かが欠けているかもしれませんが、lsの出力を取得してハッシュを生成してから別のハッシュを取得するbashスクリプトがあります。ハッシュが一致すると、何もしません。異なる場合は、管理者に電子メールを送信し、ハッシュを上書きして再照合する必要があります。スクリプトは次のとおりです。

logday="$(date '+%Y-%m-%d')"
sdir="/home/admin/notify"
timestamp="$(date '+%Y-%m-%dT%H:%M:%S')"
log="$sdir/log/$logday-notification.log"

if ! test -f $sdir/hash1; then
  touch $sdir/hash1
  ls -alR /mnt/DVR/3 | md5sum > $sdir/hash1
else
  echo "hash already present"
fi
ls -alR /mnt/DVR/3 | md5sum > $sdir/hash2
if cmp -s $sdir/hash1 $sdir/hash2; then
  echo "$timestamp - Hash matches, nothing to do." >> "$log"
else
  echo "$timestamp - Hash has changed! Sending notification. Writing new value to hash1" >> "$log"
  cp -f $sdir/hash1 $sdir/hash2
  echo "it changed" | mail -s "alert" [email protected]
fi
exit

したがって、スクリプトを初めて実行すると、次のログ出力が表示されます。

「ハッシュマッチ、やるべきことはありません」

言葉になりますね。ハッシュ*を処理すると、次の結果が表示されます。

$ cat hash*
36d28cb4a6b384abe5c3acc81c93c891  -
36d28cb4a6b384abe5c3acc81c93c891  -

繰り返しますが、言葉になります。

もう一度実行するとハッシュが一致しますが、メールはありません。繰り返しますが、これは意味があり、何も変更されませんでした。

これでディレクトリを変更します。スクリプトを実行します。 「ハッシュが変更されました!通知を送信しています。hash1に新しい値を書き込んでいます。」というメッセージが表示されます。

はい、そうです。ハッシュが違います。スクリプトはハッシュを上書きするため、一致する必要があります。 Running cat hash*がこれを確認しました。

$ cat hash*
856d69a9b53008988d034c9504345541  -
856d69a9b53008988d034c9504345541  -

両方のファイルは同じです。しかし、今スクリプトをもう一度実行すると、まだ異なると出てきます!

私はなぜこれが起こるのか疑問に思い始めました。どんなアイデアがありますか?

ベストアンサー1

echo "$timestamp - Hash has changed! Sending notification. Writing new value to hash1" >> "$log"
cp -f $sdir/hash1 $sdir/hash2

あなた説明するに新しい値を書きますが、hash1実際には何をしていますか?するhash1以前の値をにコピーしますhash2

したがって、スクリプトが実行されない場合、両方のハッシュは常に同じですが、値は前のハッシュなので、次回実行されると通知が再トリガされます。

この問題を解決するには、次のコマンドでハッシュ順序を変更してくださいcp

cp -f $sdir/hash2 $sdir/hash1

おすすめ記事