You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:48:41