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

如何在Makefile的shell函数中转义#符号以兼容新旧版本make?

解决Makefile中$(shell)函数跨版本获取#符号的兼容性问题

方法1:用Make内置函数构造(推荐,无需调用shell)

直接借助Make的subst内置函数生成#符号,完全避开shell调用和Make版本带来的兼容性问题:

FOO2 := $(subst x,,x#)
$(info FOO2: $(FOO2))

逻辑很简单:把字符串x#中的x替换为空,最终得到#。由于是Make原生的字符串处理逻辑,无论新旧版本,输出结果都是:

FOO2: #

方法2:用printf替代echo(稳定的shell调用方式)

如果必须通过shell获取#,别用echo,换成printf——它的转义行为更统一,不会被Make版本规则干扰:

FOO2 := $(shell printf '#')
$(info FOO2: $(FOO2))

追求极致兼容性的话,还可以用#的八进制转义码:

FOO2 := $(shell printf '\043')
$(info FOO2: $(FOO2))

这两种写法在新旧Make版本中都会输出FOO2: #,因为printf直接输出目标字符,不会被Make或shell的转义规则打乱。

原写法出现差异的原因

旧版本Make会先解析$(shell)内部的\#,将其转换为#后再传递给shell执行,所以echo '\#'实际等价于echo '#',输出#;而新版本Make会把\#原封不动传给shell,echo '\#'就会直接输出\#,最终导致结果不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:44:55