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

如何在Makefile中安全引用目录,避免执行`rm -fr /*`的风险?

解决Makefile clean目标的路径安全问题

以下是几种实用方案,可避免因变量未定义/拼写错误导致的高危rm -rf /*操作:

1. 提前检查变量,未定义直接终止

在Makefile开头添加变量校验逻辑,一旦BUILD_DIR未定义,make会立即报错退出,根本不会执行clean命令:

ifndef BUILD_DIR
$(error BUILD_DIR is not defined! Please specify it before running make.)
endif

.PHONY: clean
clean:
    rm -fr $(BUILD_DIR)/*

2. 在clean命令中做shell前置检查

如果不想提前终止整个Makefile流程,可在clean的shell命令里先判断变量是否为空,为空则报错并终止删除操作:

.PHONY: clean
clean:
    @if [ -z "$(BUILD_DIR)" ]; then echo "ERROR: BUILD_DIR is undefined!"; exit 1; fi
    rm -fr -- $(BUILD_DIR)/*

这里的--是rm的安全参数,确保后续路径不会被当作命令选项解析。

3. 给变量设置默认值

如果允许BUILD_DIR有默认路径(比如当前目录下的build文件夹),用?=给变量设置默认值,彻底避免空值情况:

BUILD_DIR ?= ./build

.PHONY: clean
clean:
    rm -fr -- $(BUILD_DIR)/*

?=的作用是:仅当BUILD_DIR未被定义时,才使用指定的默认值。

4. 结合wildcard避免空路径匹配

如果BUILD_DIR下可能没有文件,可先用wildcard过滤空匹配,即使变量为空,rm也不会执行危险操作:

.PHONY: clean
clean:
    @if [ -z "$(BUILD_DIR)" ]; then echo "ERROR: BUILD_DIR is undefined!"; exit 1; fi
    rm -fr -- $(wildcard $(BUILD_DIR)/*)

wildcard会展开为BUILD_DIR下的实际文件列表,如果为空,rm命令就变成rm -fr --,不会执行任何删除操作。

内容的提问来源于stack exchange,提问作者Reverent Lapwing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:42:11