考虑以下Makefile:
X = macro-X-value
foo:
echo $X $(X)这里的目的是使用X作为环境变量和宏的名称。当使用bmake时,它按预期工作:
$ env X=env-X-value /usr/bin/bmake
echo $X macro-X-value
env-X-value macro-X-value
$ env -i /usr/bin/bmake
echo $X macro-X-value
macro-X-value但是当使用GNU (4.2.1节)时,这种行为会变得很奇怪:
$ env X=env-X-value /usr/bin/gmake
echo $X macro-X-value
macro-X-value macro-X-value
$ env -i /usr/bin/gmake
echo $X macro-X-value
macro-X-value因此,似乎gmake将宏X的值导出为环境变量X,但仅当外部环境已经导出X时。
我在POSIX作描述里找不到任何关于这个的东西。事实上,这里有这样一点:
宏不会导出到要运行的命令的环境中。
这种行为记录在案了吗?这是个虫子吗?它能被禁用吗?
发布于 2021-04-26 20:54:39
根据我从手册中可以读到的内容,GNU似乎将其变量处理得有点像shell。当它启动时,它将变量从环境导入到它的内部集合,在运行命令时,将那些标记为导出的变量导出到它们的环境中。这意味着它只有一个用于所有变量的表,不可能拥有同名的环境变量和非环境变量。
make中的变量可以来自在其中运行make的环境。使其启动时看到的每个环境变量都被转换为具有相同名称和值的make变量。
除了通过显式请求之外,如果变量最初是在环境中定义的,或者是在命令行上设置的,如果您想要将特定的变量导出到子命令中,请使用导出指令,如:
export variable …,如果您想阻止一个变量被导出,请使用unexport指令,如:unexport variable …。
据我所测试,使用unexport X只是从启动过程的环境中完全删除了它,似乎没有办法保留一个与内部变量不同的值。
使用.POSIX内置目标似乎也没有改变这种行为,但是无论如何,对于POSIX行为来说,no的他们的意见似乎是太严格了。
https://unix.stackexchange.com/questions/646255
复制相似问题