我的 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 停止,但会考虑 的错误,而会忽略所有错误。condition
command
condition && command || true