使用条件运算符执行配方时出错

使用条件运算符执行配方时出错

我的 Makefile 非常简单:

all:
      [ -f MyFile ] && echo "MyFile exists"

当然,配方行以制表符开头。如果文件 MyFile 确实存在,则一切正常。但如果该文件不在当前目录中,我会得到:

Makefile:2: 目标“全部”的配方失败 make: *** [全部] 错误 1

我可以使用 if 语句来消除此错误:

all:
      if [ -f MyFile ]; then echo "MyFile exists"; fi

这两个语句在 make 之外的 sh 和 bash 中都可以正常工作。我不清楚使用条件运算符时出现 make 错误的原因是什么。一个想法发生了什么事?

答案1

[ -f MyFile ] && echo "MyFile exists"

MyFile如果不存在则以非零状态代码退出,而

if [ -f MyFile ]; then echo "MyFile exists"; fi

退出并显示成功(零)状态代码,除非MyFile存在 echo因写入错误而失败。

Make 依靠状态码来确定命令是否失败,并且当任何命令失败时它默认停止执行。您可以通过在单个命令行中添加前缀来禁用此功能-,或者通过运行make -i或指定特殊.IGNORE目标来整体禁用此功能。因此

-[ -f MyFile ] && echo "MyFile exists"

都会允许 Make 继续,但如果MyFile不存在,仍然会导致它打印一条消息:

make: [Makefile:14: test] 错误 1(忽略)

图案|| true在这种特定情况下也适用,但它会忽略echo.如果为 false,if condition; then command; fi不会导致 Make 停止,但会考虑 的错误,而会忽略所有错误。conditioncommandcondition && command || true

相关内容