2014-10-09 68 views
0

我有在它下面的两行cron作业:为什么用-r测试的文件不能被猫读取?

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以检查它是否可读并且否定结果。这意味着,如果文件不可读,则检查成功。评估可以在这里停止,因为表达式已经是真的。 cat将不会被调用。

否则将评估-o条件,也就是说,如果文件存在,则执行cat

为什么cat报告错误,即文件无法读取,但test -r发现它是可读的?

+0

重要的是区分“'LOCK'不可读”和“'$ LOCK'为空”?如果没有,你可以使用'[“$ ADDR_NOW”!=“$(cat”$ LOCK“2>/dev/null)”]''。 – chepner 2014-10-09 14:12:25

回答

5

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

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

然后第二次检查将只会发生,如果第一次失败。

+0

什么应该改变之间的左侧和右侧?除此之外,没有其他人正在使用该文件。 – ceving 2014-10-09 08:30:05

+0

cron不会创建它,因此其他任何内容都实际使用该文件。 – 2014-10-09 08:33:21

+0

@ceving:我明白了。我用这些新知识更新了我的答案。我认为它现在会解决你的问题。 – 2014-10-09 08:33:44

相关问题