gpt4 book ai didi

bash - 我可以告诉 Make 忽略环境变量吗?

转载 作者:行者123 更新时间:2023-11-29 09:01:02 25 4
gpt4 key购买 nike

我最近在使用 Make (v3.81) 时遇到了一些奇怪的行为。

假设我有以下 Makefile:

FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ')

all:
@echo "Hi"

clean:
@echo "Hi again"

看起来很简单,对吧?值得注意的是,FOOBAR 是一个“递归扩展变量”,因此在我引用它之前不应对其求值。请注意,我从未提及它。另请注意,nonexistentdirectory 并不像您预期​​的那样存在。

现在假设我在调用 Make 目标之前在 shell 中设置了 FOOBAR :

compy386$ FOOBAR="stuff" make clean
find: nonexistentdirectory: No such file or directory
Hi again

为什么要评估 FOOBAR?显然,这与变量是在 shell 中定义的事实有关。我是否应该预料到用户可能已经在他们的 shell 中设置了变量?我在这里做错了什么?!

最佳答案

FOOBAR 正在评估,因为您正在运行一个配方(用于 clean)并且 FOOBAR 存在于进入 的环境中制作。因为 FOOBAR 在入口时就存在于环境中,它成为一个导出变量,这意味着 make 将把它作为环境的一部分提供给配方中的任何程序。 make 不特例 echo;它只使用在您的路径中找到的那个。而且它不知道该实用程序是否会引用特定的环境变量,因此它必须导出所有导出的变量,这意味着它必须评估 FOOBAR

(官方说法,参见make手册中Variables from the Environment的第三段。另见recursive make invocation上的配方。)

要回答直接的问题,您可以告诉 make 忽略变量来自环境的事实,这样它就不会通过取消导出来重新导出它:

unexport FOOBAR

关于bash - 我可以告诉 Make 忽略环境变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20646633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com