我最近在使用 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/