Makefile中Bash脚本执行出错后仍判定成功的解决方法
解决Makefile命令失败时打印信息并终止执行的问题
你的问题出在shell逻辑运算符的优先级和命令行语法上,原来的写法导致命令最终退出码不符合预期,无法触发Makefile终止。可以通过以下方式实现需求:
正确写法
all: command || { echo "command Failed"; false; }
说明:
- 用
{}把错误处理命令打包成整体,确保command失败时,先打印提示信息,再通过false返回非零退出码,让Makefile终止执行。 {}前后必须加空格,内部命令末尾要加;,这是shell的语法要求。- 如果需要保留
command自身的错误输出(默认会输出到终端),无需额外操作;要是想把command的标准错误重定向到标准输出一起打印,可修改为:all: command 2>&1 || { echo "command Failed"; false; }
原写法失效的原因:
你原来的命令command || echo "command Failed" && false;存在两个问题:
- shell中
&&优先级高于||,实际执行逻辑等价于command || (echo "command Failed" && false),错误分支的退出码被后续逻辑干扰。 - 末尾的分号会让shell额外执行一个空命令,空命令的退出码为0,导致整个命令行最终退出码始终是0,Makefile因此判定执行成功,不会终止。
内容的提问来源于stack exchange,提问作者user9890324
相关产品推荐
相关产品推荐

