Bash脚本中判断make命令执行失败逻辑不生效的问题
CMake生成的Makefile执行失败时shell判断逻辑不生效的解决方案
问题根因
- 原脚本仅判断
make的退出码等于1时才进入失败分支,不符合make的退出码规则:任何非0的退出码都代表make执行失败,CMake生成的Makefile在编译错误、依赖缺失、权限不足等不同失败场景下,可能返回2、3等其他非0值,自然无法触发原判断逻辑。 - 额外潜在问题:原脚本中
$1未加引号,若传入的路径包含空格会导致命令执行异常。
修复方案
方案1:修改退出码判断逻辑(最小改动)
直接判断退出码是否不等于0即可覆盖所有失败场景:
make --directory="$1/build" if [ $? -ne 0 ]; then echo "Bad build" exit 1 else echo "Good build" fi
方案2:更简洁的写法(推荐)
直接把make命令放在if判断条件中,不需要显式读取$?,可读性更高:
if ! make --directory="$1/build"; then echo "Bad build" exit 1 else echo "Good build" fi
额外最佳实践
如果你的脚本不需要在make失败后执行特殊的清理逻辑,可以在脚本开头加上set -eo pipefail,shell会自动在任意命令执行失败时终止脚本运行,无需手动编写退出码判断:
#!/bin/bash set -eo pipefail make --directory="$1/build" echo "Good build"
内容的提问来源于stack exchange,提问作者fm_user8
相关产品推荐
相关产品推荐

