Bash 为什么在这个最小生成文件中需要括号(或大括号)?
我很困惑,为什么我需要回显Bash 为什么在这个最小生成文件中需要括号(或大括号)?,bash,variables,makefile,variable-expansion,Bash,Variables,Makefile,Variable Expansion,我很困惑,为什么我需要回显$(VAR1)或${VAR1}以获取此Makefile中的输出“abcd”: VAR1=abcd myTarget: @echo $VAR1 all: myTarget .PHONY: all 相反,make将回显$V(这是空字符串),然后是“AR1”,这是我的输出 我知道在bash中,echo$VAR1可以获得“abcd”,我的理解是代码的缩进部分在bash中运行。我用的是GNU Make 3.81 我知道在bash中,echo$VAR1可以获
$(VAR1)
或${VAR1}
以获取此Makefile中的输出“abcd”:
VAR1=abcd
myTarget:
@echo $VAR1
all: myTarget
.PHONY: all
相反,make将回显$V
(这是空字符串),然后是“AR1”,这是我的输出
我知道在bash
中,echo$VAR1
可以获得“abcd”,我的理解是代码的缩进部分在bash
中运行。我用的是GNU Make 3.81
我知道在bash
中,echo$VAR1
可以获得“abcd”,我的理解是代码的缩进部分是由bash
执行的
$VAR1
由make
(而不是bash
)展开,实际上相当于展开$(V)AR1
。扩展后的结果行是由bash
执行的
您需要在$VAR1
中转义前导的$
,以防止make
展开变量。可以通过在$VAR1
之前添加一个$
来实现转义,即:
myTarget:
@echo $$VAR1
这样,
bash
将收到需要的行echo$VAR1
,因为这是引用变量所使用的语法。例如,请参见,甚至是POSIX标准定义的make
请注意,makefiles不是shell脚本,并且没有与shell脚本相同的语法。Makefiles在配方中确实包含shell脚本(或者至少包含shell命令)
通过设置变量:
VAR1 = abcd
在makefile中,您正在创建make变量,而不是shell变量
配方(由制表符缩进的命令)首先由make解析,并展开所有make变量引用。然后,扩展的结果被传递给shell。由于要在配方中引用make变量,因此必须使用make变量引用语法