Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 为什么在这个最小生成文件中需要括号(或大括号)?_Bash_Variables_Makefile_Variable Expansion - Fatal编程技术网

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变量引用语法