我有一个包含以下内容的Makefile:
AVAR=""
all :
if [ -d ../old ]; then \
(echo "$@ Ping!"; AVAR="../old"; echo $(AVAR)) \
fi
@echo $(AVAR)
这个想法是,取决于是否存在目录“ ../old”在AVAR中有信息(可在以后使用),但是,if评估为true,然后Ping!回显,但在if语句内部或外部均未分配任何内容给AVAR。
输出如下:
$ make all
if [ -d ../old ]; then \
(echo "all Ping!"; AVAR="../old"; echo "") \
fi
all Ping!
任何见解表示赞赏。
尝试
(echo "$@ Ping!"; AVAR="../old"; echo $$AVAR) \
代替
(echo "$@ Ping!"; AVAR="../old"; echo $(AVAR)) \
1] Makefile配方中的每个命令都在其自己的子Shell中运行。您在第一个命令(“ if”语句)中定义了AVAR
,因此它对第二个命令(@echo $(AVAR)
)不可用。
2)在第一个命令中,您定义了AVAR
,但是您没有正确地调用它。术语$(AVAR)
是Make语法; Make会在执行命令之前[[before
$AVAR
。但是,如果尝试这样做,Make会将$A
扩展为空,您将获得“ VAR”。因此,您用另一个$
“转义了$
:all :
if [ -d ../old ]; then \
(echo "$@ Ping!"; AVAR="../old"; echo $$AVAR) \
fi