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

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开头加一行
    SHELL := /bin/bash
    
    之后所有命令都会用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:37:18