Makefile实现不存在则创建文件夹时,文件夹已存在报错如何解决
错误原因
Make 执行规则下的每一行shell命令时,会以该行命令的最终退出码判定执行是否成功:只要退出码非0,就会直接判定任务失败、终止后续流程,和命令内部有没有用&&短路没有关系。
你写的[ ! -d ${folder} ]本质是调用test命令([是test命令的简写别名)做判断:
- 当文件夹不存在时,
! -d判断为真,test命令返回退出码0,后续mkdir正常执行,整行命令最终退出码为0,流程正常 - 当文件夹已存在时,
! -d判断为假,test命令直接返回退出码1,&&触发短路逻辑确实不会执行后面的mkdir,但此时这行命令最后执行的就是返回1的test命令,整行最终退出码为1,Make就会抛出你看到的Error 1,报错和mkdir完全无关。
解决方法
推荐按优先级选以下方案:
- 最简洁的标准写法:直接去掉多余的判断,只用
mkdir -p即可。mkdir -p原生支持「目录不存在则创建,已存在则静默跳过不报错」的逻辑,完全不需要额外前置判断,修改后完整代码如下:
.DEFAULT_GOAL := all folder := "myfolder" createfolder: mkdir -p ${folder} nextstep: echo "Got here!" all: createfolder nextstep
- 如果一定要保留显式判断逻辑,可以在命令末尾补
|| true,强制整行命令最终退出码为0,写法如下:
createfolder: [ ! -d ${folder} ] && mkdir -p ${folder} || true
- 也可以改用完整的if分支结构,这种写法下分支未命中时整个if语句的退出码为0,不会触发报错:
createfolder: if [ ! -d ${folder} ]; then mkdir -p ${folder}; fi
内容的提问来源于stack exchange,提问作者Carlos Adir
相关产品推荐
相关产品推荐

