我试图指示 GNU Make 3.81 在命令失败时不要停止(因此我在命令前加上-
),但我还想检查下一个命令的退出状态并打印更多信息。但是我的 Makefile 下面失败了:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
为什么上面的 Makefile 会回显“成功!”而不是“失败!” ?
更新:
遵循并扩展已接受的答案,下面是它的写法:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
答案1
规则中的每个更新命令都Makefile
在单独的 shell 中执行。因此不包含先前失败命令的退出状态,它包含新 shell 中$?
的默认值。$?
这就是为什么你的[ $? -eq 0 ]
测试总是成功的。
答案2
您不需要进行测试,$?
因为&&
如果$?
为零,则有效;||
如果返回值非零,则继续进行。
并且您不需要减号,因为 make 的返回值是从该行的最后一个进行程序调用中获取的。所以这很好用
失败:
@/bin/false && echo "success!" || echo "failure!"
成功:
@/bin/true && echo "success!" || echo "failure!"
相反的情况会发生:如果您想执行自己的消息并希望使用非零值来中断 make 过程,则需要编写如下内容:
失败:
@/bin/false && echo "success!" || { echo "failure!"; exit 1; }
答案3
当由于“-”或“-i”标志而要忽略错误时,make 将错误返回视为成功,只不过它会打印一条消息,告诉您 shell 退出时的状态代码,并表示错误已被忽略。
要make
在这种情况下利用 的退出状态,请make
从脚本执行:
#!/bin/bash
make
([ $? -eq 0 ] && echo "success!") || echo "failure!"
并让你的 Makefile 包含:
all:
/bin/false
答案4
我最终是这样做的:
.PHONY: test-cleanup
test-cleanup:
$(eval CLEANUP = echo "Some cleanup procedure")
@/bin/true && touch _testok || $(CLEANUP) ;\
if [ -f "_testok" ]; then \
rm -f _testok ;\
echo "What a success!" ;\
else \
echo "Failure :-(" ;\
exit 1 ;\
fi
哪个打印:
What a success!
如果更改/bin/true
为,/bin/false
则会得到以下输出:
Some cleanup procedure
Failure :-(
make: *** [Makefile:4: test-cleanup] Error 1