我看到了这个问题:
然后我做了如下:
HELLO='hello 1st'
HELLO_WORLD='$(HELLO) world!'
HELLO='hello 2nd'
all :
echo $(HELLO_WORLD)
HELLO='hello 3rd'
echo $(HELLO_WORLD)
HELLO='hello 4th'
echo $(HELLO_WORLD)
结果是:
root@ubuntu:~# make all -s
hello 2nd world!
hello 2nd world!
hello 2nd world!
我很困惑,为什么'HELLO'的值不是hello 4th
而是hello 2nd
更新
我更新了我的代码:
HELLO='hello 1st'
HELLO_WORLD='$(HELLO) world!'
HELLO='hello 2nd'
all :
HELLO='hello 3rd' && echo $(HELLO_WORLD)
HELLO='hello 4th' && echo $(HELLO_WORLD)
结果:
root@ubuntu:~# make all -s
hello 2nd world!
hello 2nd world!
我已经意识到像HELLO='hello 3rd'
这样的句子最终不是变量赋值。
你们两个帮了我很多忙。谢谢你的回答!
答案 0 :(得分:2)
像
这样的行HELLO='hello 3rd'
不是(make)变量赋值,而是规则操作中的行。
relevant section of the make manual表示变量必须位于行的开头。
正如您所写,HELLO=...
行只是行动路线。在这些情况下,命令HELLO='hello 3rd'
在新shell中设置 shell 变量HELLO
,然后立即退出(作为@ sergei-kurenkov提到的答案形式,每行都是在另一个shell中执行。)
答案 1 :(得分:0)
为什么终端打印不是
hello 4th world
而是hello 2nd world
食谱中的每一行都在自己的shell中执行。因此,在您取消注释4行之后,对于目标“all”,您将运行shell 5次,并且在第一次运行中设置的环境变量将不会在第二次运行中看到,等等。
来源:http://www.gnu.org/software/make/manual/html_node/Execution.html#Execution