首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当导出宏已经存在时,GNU才使导出宏成为环境变量

只有当导出宏已经存在时,GNU才使导出宏成为环境变量
EN

Unix & Linux用户
提问于 2021-04-22 13:04:32
回答 1查看 572关注 0票数 1

考虑以下Makefile

代码语言:javascript
复制
X = macro-X-value
foo:
        echo $X $(X)

这里的目的是使用X作为环境变量和宏的名称。当使用bmake时,它按预期工作:

代码语言:javascript
复制
$ 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节)时,这种行为会变得很奇怪:

代码语言:javascript
复制
$ 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作描述里找不到任何关于这个的东西。事实上,这里有这样一点:

宏不会导出到要运行的命令的环境中。

这种行为记录在案了吗?这是个虫子吗?它能被禁用吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-04-26 20:54:39

根据我从手册中可以读到的内容,GNU似乎将其变量处理得有点像shell。当它启动时,它将变量从环境导入到它的内部集合,在运行命令时,将那些标记为导出的变量导出到它们的环境中。这意味着它只有一个用于所有变量的表,不可能拥有同名的环境变量和非环境变量。

6.10环境变量

make中的变量可以来自在其中运行make的环境。使其启动时看到的每个环境变量都被转换为具有相同名称和值的make变量。

5.7.2将变量传递给Sub make

除了通过显式请求之外,如果变量最初是在环境中定义的,或者是在命令行上设置的,如果您想要将特定的变量导出到子命令中,请使用导出指令,如:export variable …,如果您想阻止一个变量被导出,请使用unexport指令,如:unexport variable …

据我所测试,使用unexport X只是从启动过程的环境中完全删除了它,似乎没有办法保留一个与内部变量不同的值。

使用.POSIX内置目标似乎也没有改变这种行为,但是无论如何,对于POSIX行为来说,no的他们的意见似乎是太严格了。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/646255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档