cmp 的行为不符合预期

cmp 的行为不符合预期

也许我遗漏了一些东西,但我有一个 bash 脚本,它获取 ls 的输出,生成哈希值,然后获取另一个哈希值。如果哈希值匹配,则不执行任何操作。如果它们不同,则应向管理员发送电子邮件,然后覆盖哈希值,以便它们再次匹配。这是脚本:

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”

是的,有道理,哈希值不同。该脚本会覆盖哈希值,因此它们现在应该匹配。运行 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

相关内容