我刚才使用Makefiles&我很困惑......
我在Makefile中有以下内容......
USER_ID := $(id -u)
USER_ID_ESC := $$(id -u)
MAKEFILE := $(realpath $(lastword $(MAKEFILE_LIST)))
ROOT_DIR := $(dir $(MAKEFILE))
x:
echo $${USER_ID}
echo ${USER_ID}
echo $(USER_ID)
echo $${USER_ID_ESC}
echo ${USER_ID_ESC}
echo $(USER_ID_ESC)
echo $${ROOT_DIR}
echo ${ROOT_DIR}
echo $(ROOT_DIR)
exit 0
哪个给出输出......
echo ${USER_ID}
echo
echo
echo ${USER_ID_ESC}
echo $(id -u)
502
echo $(id -u)
502
echo ${ROOT_DIR}
echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
echo /Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
/Users/toby/src/bitbucket.org/limtool/commissioning-tool-api/
exit 0
我理解使用双$
来逃避$
的使用,但我不明白为什么使用单$
来realpath
& ; dir
命令有效,但将id
命令用于BIPUSH 10
命令。
有人可以帮助我理解吗?
由于
答案 0 :(得分:2)
realpath
和dir
是GNU make
个函数,id
不是。如果要在Makefile中使用shell函数,请使用$(shell id -u)
。 realpath
和dir
未被转义,GNU make正确解释了它们。
请参阅GNU make file name functions以及GNU make shell function手册页。
当您在Makefile中编写$(id -u)
时,make
会尝试查看它是函数还是变量,因为它们都不会扩展为任何东西,因此空echo
1}}秒。
现在,当你逃脱美元符号时,你的ID被正确写入的原因是神秘的,可能是由于你的shell。由于make
已转义,因此$
没有尝试展开它,因此echo $(id -u)
已发送到系统。您可以直接在shell中试用它,您应该获得相同的结果。