如何在Makefile中实现Bash的{a,b,c}通配符等效操作?
在Makefile中实现
rm -f {a,b,c}_foo/*.csv的等效操作 问题出在Make默认使用POSIX标准的/bin/sh作为shell,而bash独有的大括号扩展(brace expansion)在sh里是不支持的——直接写{a,b,c}_foo/*.csv会被sh当成一个完整的文件名去匹配,自然找不到对应文件。
下面给你几个实用的解决办法:
方法1:让Make用bash执行命令
在Makefile开头显式指定shell为bash,这样就能直接用你熟悉的大括号语法了:
# 强制使用bash替代默认的sh SHELL := /bin/bash clean: rm -f {a,b,c}_foo/*.csv
方法2:用Make的wildcard函数生成文件列表
如果不想依赖bash,用Make自带的wildcard函数来匹配文件是更通用的方案,它会自动扫描符合模式的文件并生成列表:
clean: rm -f $(wildcard a_foo/*.csv b_foo/*.csv c_foo/*.csv)
这个方法的好处是:如果某个目录下没有.csv文件,wildcard会返回空字符串,不会让rm抛出“找不到文件”的警告(即使加了-f,bash的大括号扩展在无匹配时还是会有警告)。
方法3:用foreach批量处理目录(适合目录有规律的场景)
如果你的目录名是有规律的(比如都是[字母]_foo),可以先定义目录前缀变量,再用foreach循环生成所有匹配路径:
# 定义需要处理的目录前缀 DIR_PREFIXES := a b c clean: rm -f $(foreach prefix,$(DIR_PREFIXES),$(wildcard $(prefix)_foo/*.csv))
后续要新增目录的话,只需要修改DIR_PREFIXES变量就行,维护起来更方便。
内容的提问来源于stack exchange,提问作者user3313834
相关产品推荐
相关产品推荐

