为什么 Makefile 导出会在我的变量中添加一个额外的“=”?

Why is Makefile export adding an extra `=` to my variables?

提问人:Truman Purnell 提问时间:11/14/2023 更新时间:11/14/2023 访问量:50

问:

我有这个 Makefile:

export $(shell echo "truman=name")

env:
    export

当我跑步时,我看到:make env

export truman="name="

为什么我的出口中有额外的内容?=

makefile 环境变量

评论

1赞 Vroomfondel 11/14/2023
非常有趣。你能试着告诉我们它的输出吗?$(info <$(shell echo "truman=name")>)

答:

2赞 PyariBilli 11/14/2023 #1

您可以直接将值分配给 Makefile 中的变量,而无需使用 .echo

export truman=name

env:
    @echo $$truman

如果要动态生成和导出变量(如 、 和 ),则可以在 shell 命令中使用循环来单独分配每个变量。这是你如何做到的:truman=nameheight=tallhandsome=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=