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

标签 bash makefile

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

相关文章:

linux - 将 shell 脚本添加到配置文件

Linux Bash函数条件执行用户输入

arrays - 最佳实践 : Print an array in a bash script

C: 如何用 makefile 编译包含在另一个头文件中的头文件?

makefile - makefile中@$是什么意思?

linux - 在 bash 脚本中终止进程

python - 加速 Python 脚本的 for 循环

makefile - 在make文件中分割变量

makefile - 一次为多个目标执行配方

makefile - make test 对 mocha 测试没有任何作用