为什么用-r测试的文件不能被cat读取?

时间:2014-10-09 08:23:31

标签: bash

我有一个cron作业,其中包含以下两行:

LOCK=/var/run/dns-check
...
if [ ! -r "$LOCK" -o "$ADDR_NOW" != "$(cat $LOCK)" ] ; then

这是脚本中cat的唯一用法。今天我收到了来自cron的邮件,出现以下错误:

cat: /var/run/dns-check: No such file or directory

我想知道这里发生了什么。

我正在使用-r测试文件,以检查它是否可读并取消结果。这意味着,如果文件不可读,则检查成功。评估可以在这里停止,因为表达式已经是真的。 <{1}}将不会被调用。

否则会评估cat条件,这意味着,如果文件存在,则执行-o

为什么cat报告错误,无法读取文件,尽管cat发现它是可读的?

1 个答案:

答案 0 :(得分:5)

您使用的条件形式不进行短路评估。相反,试试这个:

[ ! -r "$LOCK" ] || [ "$ADDR_NOW" != "$(cat $LOCK)" ]

然后第二次检查只会在第一次检查失败时发生。