提问人:Truman Purnell 提问时间:11/14/2023 更新时间:11/14/2023 访问量:50
为什么 Makefile 导出会在我的变量中添加一个额外的“=”?
Why is Makefile export adding an extra `=` to my variables?
问:
我有这个 Makefile:
export $(shell echo "truman=name")
env:
export
当我跑步时,我看到:make env
export truman="name="
为什么我的出口中有额外的内容?=
答:
2赞
PyariBilli
11/14/2023
#1
您可以直接将值分配给 Makefile 中的变量,而无需使用 .echo
export truman=name
env:
@echo $$truman
如果要动态生成和导出变量(如 、 和 ),则可以在 shell 命令中使用循环来单独分配每个变量。这是你如何做到的:truman=name
height=tall
handsome=false
export_vars := $(shell for var in "truman=name" "height=tall" "handsome=false"; do echo $$var; done)
$(foreach var,$(export_vars),$(eval export $(var)))
env:
@echo truman=$$truman
@echo height=$$height
@echo handsome=$$handsome
评论
0赞
Truman Purnell
11/14/2023
我需要分配一些动态生成的变量,例如 目前,所有这些都附加了一个额外的附加功能。export $(shell echo truman=name height=tall handsome=false)
=
0赞
PyariBilli
11/14/2023
我已经编辑了我的答案以处理动态生成的变量,就像您的示例中一样
0赞
tripleee
11/14/2023
#2
调用在这里完全没有意义。$(shell ...)
你只是想要
export truman=name
(或者可能是为了避免延迟扩展)。truman := name
如果值和赋值来自外部进程,则可以说
$(eval export $(shell echo gehzna=anzr | tr a-z n-za-m))
1赞
HolyBlackCat
11/14/2023
#3
这看起来像一个 Make 错误,我想我知道发生了什么。
make
看到 ,并认为整个是变量名,而没有检查它。由于它认为没有指定任何值,因此它会在末尾添加。export $(...)
$(...)
=
=
然后,整个字符串被传递给类似 putenv
的东西,它将第一个视为分隔符,并视为值。truman=name=
=
name=
正如其他答案中所说,解决方法是使用 .$(eval )
评论
0赞
MadScientist
11/15/2023
是的,make 是在扩展值之前搜索要查找的单词,而不是在扩展值之后。如果没有 before 扩展,则 make 将其视为没有赋值的变量名称(例如,)。这是否是一个错误,在解析查找之前,需要仔细考虑进行扩展的缺点。=
=
export foo
=
评论
$(info <$(shell echo "truman=name")>)