Makefile中Shell语法执行报错,终端直接执行正常的原因咨询
问题:Makefile中Shell变量赋值报错,但终端执行正常?
我编写了如下Makefile:
.SILENT: test3: PARAM_3=$(shell echo "Shell variable")
执行make test3时出现如下错误:
/bin/sh: 1: variable: not found make: *** [Makefile:5: test3] Error 127
但在终端中执行如下命令却可正常运行:
$ PARAM_3=$(echo "Shell variable")
想咨询该Makefile写法为何执行报错,而终端执行却正常?
解答
核心原因是Make和Shell对$的解析优先级不同:
Makefile中的解析逻辑
Make会优先处理命令行里的$符号——你写的$(shell echo "Shell variable")会被Make识别为内置的shell函数,执行后返回字符串Shell variable。此时传给Shell的命令变成了:PARAM_3=Shell variableShell看到这条命令时,会把
Shell当作变量名,后面的variable被当成独立的命令去执行,自然就报“variable: not found”的错误。终端中的执行逻辑
终端里直接执行PARAM_3=$(echo "Shell variable")时,整个命令由Shell直接解析:$(echo ...)是Shell的命令替换语法,执行后得到完整的Shell variable字符串,直接完成变量赋值,没有Make的预解析干扰,所以能正常运行。
修复方案
有两种常见的解决方式:
- 转义
$让Shell处理命令替换:在Makefile的命令行里,把$写成$$,这样Make会将其解析为单个$传给Shell,让Shell处理命令替换:.SILENT: test3: PARAM_3=$$(echo "Shell variable") - 用Make变量替代Shell变量:如果你的需求是定义Make层面的变量,而非仅在Shell命令中使用,可将赋值放在规则外:
.SILENT: PARAM_3 := $(shell echo "Shell variable") test3: @echo $(PARAM_3)
内容的提问来源于stack exchange,提问作者dviddddd
相关产品推荐
相关产品推荐

