Makefile中rm命令文件匹配规则及跨OS执行异常排查
Makefile中rm命令的文件匹配规则及问题排查
一、Makefile里rm的文件匹配逻辑
- Makefile本身不处理任何通配符(包括
{a,b}这种大括号扩展),所有命令都会直接丢给系统默认Shell执行 - rm命令本身不负责解析大括号扩展,这种语法是Shell(比如Bash)的特性,rm只接收Shell扩展后的文件名列表来执行删除操作
二、Mint下Makefile中rm -f test_{a,b}.o无效的原因
- Mint属于Debian系发行版,默认Shell是
dash,而dash不支持{a,b}这种大括号扩展语法;CentOS7默认Shell是Bash,支持该扩展,所以能正常工作 - 你直接在终端执行时用的是Bash(终端默认Shell),所以扩展有效;但Makefile默认调用系统默认Shell(Mint上是dash),无法解析
{a,b},导致rm找不到名为test_{a,b}.o的文件,自然没效果
三、可行的解决办法
- 强制Makefile用Bash执行:在Makefile开头加一行
之后所有命令都会用Bash运行,大括号扩展就能正常生效SHELL := /bin/bash - 改用兼容性更好的写法:要么像你现在一样直接列出所有文件
rm -f test_a.o test_b.o,要么用Makefile支持的通配符rm -f test_*.o(如果目录里只有这两个目标文件的话) - 用Shell兼容的扩展语法:比如开启extglob后用
rm -f test_@(a|b).o,但这种需要额外配置,不如前两种方便
内容的提问来源于stack exchange,提问作者Z.Lun
相关产品推荐
相关产品推荐

