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

cev*_*ing 0 bash

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

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

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

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

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

我正在测试该文件-r以检查它是否可读并否定结果.这意味着,如果文件不可读,则检查成功.评估可以在这里停止,因为表达式已经是真的.cat不会被叫.

否则,-o将评估条件,这意味着,如果文件在那里,cat则执行.

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

Joh*_*nck 5

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

[ ! -r "$LOCK" ] || [ "$ADDR_NOW" != "$(cat $LOCK)" ]
Run Code Online (Sandbox Code Playgroud)

然后只有在第一次失败时才会进行第二次检查.