我将以下Makefile放在 / tmp :
中VAR := $$(basename $$(pwd))
do:
echo $(VAR) && cd /usr && echo $(VAR) && cd /usr/share && echo $(VAR)
运行它,我期待这个输出:
tmp
tmp
tmp
但是得到:
tmp
usr
share
如何让它给我以前的输出?
答案 0 :(得分:3)
如果您想要make来评估值,则无法转义$
。通过逃避它们,你已经要求shell进行评估。你要求shell运行这个命令:
echo $(basename $(pwd)) && cd /usr && echo $(basename $(pwd)) && cd /usr/share && echo $(basename $(pwd))
给出了你看到的输出:shell一次运行一个命令,所以前一个命令在下一个命令之前生效。如果要在shell脚本中获取一个值,可以使用:
VAR := $$(basename $$(pwd))
do:
tmp=$(VAR); echo $$tmp && cd /usr && echo $$tmp && cd /usr/share && echo $$tmp
将shell变量tmp
分配给您想要的值,然后在脚本中使用它。
或者,您可以将值计算到make
变量中,并在任何地方使用它:
VAR := $(notdir $(CURDIR))
do:
echo $(VAR) && cd /usr && echo $(VAR) && cd /usr/share && echo $(VAR)
(请注意,您没有在$
的分配中转义VAR
,因此这是使用make
函数而不是shell命令。