如何在Makefile的同一行内设置并正确引用Shell变量
在Makefile同一行中正确设置并引用Shell变量
这个问题的核心在于Makefile的变量展开优先级比Shell高:当你在Makefile的命令行里写${ABC}时,Make会先尝试把它当作Make自身的变量解析,而不是留给Shell处理。你这里没定义过Make变量ABC,所以它会被展开成空字符串,最终传到Shell里的命令就变成了ABC=123 && echo value is ,自然输出空值。
要解决这个问题,我们需要让Shell来解析这个变量,有两种常用的转义方法:
方法1:用反斜杠转义美元符号
把Make的变量引用符号${ABC}改成\${ABC},这样Make就会把${ABC}原封不动传递给Shell,由Shell来解析这个Shell变量:
main: ABC=123 && echo value is \${ABC}
执行make main后会得到正确输出:
ABC=123 && echo value is ${ABC} value is 123
方法2:用双美元符号代替单美元符号
在Makefile中,$$会被解析成单个$,所以我们可以把${ABC}写成$$ABC(Shell中$ABC和${ABC}功能等价):
main: ABC=123 && echo value is $$ABC
执行后同样能得到符合预期的结果。
针对你实际的source需求的示例
如果你的真实场景是要source某个脚本并使用其中的变量,比如source./env.sh后引用里面的变量MY_VAR,用同样的转义逻辑处理即可:
load-env: source ./env.sh && echo "加载的变量值为:$$MY_VAR"
这样Make不会提前解析$$MY_VAR,而是把它传给Shell,让Shell在source脚本后正确读取变量的值。
内容的提问来源于stack exchange,提问作者Alex028502
相关产品推荐
相关产品推荐

