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

Travis CI环境下Makefile中$(shell)变量赋值报错求助

问题原因

Travis CI环境下的make对变量定义中嵌套的$(shell)函数解析更严格:当$(shell)内部包含双引号包裹的sed表达式,且表达式中引用了Makefile变量(如$(GEN))时,make会错误地将变量展开后的内容与shell函数的括号匹配,导致判定shell函数未闭合。

解决方法

方法1:使用Makefile内置字符串替换函数(推荐)

完全避免调用shell和sed,利用make原生的subst函数完成字符串替换,更高效且无解析歧义:

SPECSRC = $(subst {gen},$(GEN),{gen})

方法2:修正shell命令的引号写法

如果必须使用shell命令,调整sed表达式的引号包裹方式,将$(GEN)单独用双引号引起来,避免make解析时混淆括号边界:

SPECSRC = $(shell echo '{gen}' | sed -e 's#{gen}#'"$(GEN)"'#')

验证用修改后的测试Makefile

# Very stripped-down test Makefile

GEN = $(CURDIR)/gen

all: shell shellvar

shell:
        echo 'shell: trying inline shell-sed'
        echo $(shell echo '{gen}' | sed -e "s#{gen}#$(GEN)#")

# 方法1写法(推荐)
SPECSRC = $(subst {gen},$(GEN),{gen})
# 方法2写法(保留shell调用时使用)
# SPECSRC = $(shell echo '{gen}' | sed -e 's#{gen}#'"$(GEN)"'#')

shellvar:
        echo 'shellvar: trying shell-sed through a variable'
        echo SPECSRC = $(SPECSRC)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:15:07