Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 我能告诉Make忽略环境变量吗?_Bash_Makefile - Fatal编程技术网

Bash 我能告诉Make忽略环境变量吗?

Bash 我能告诉Make忽略环境变量吗?,bash,makefile,Bash,Makefile,我最近在使用Make(v3.81)时遇到了一些奇怪的行为 假设我有以下生成文件: FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') all: @echo "Hi" clean: @echo "Hi again" 看起来很简单,对吧?值得注意的是,FOOBAR是一个“递归扩展的变量”,所以在我引用它之前不应该对它求值。请注意,我从未提及过它。还请注意,nonexistentdir

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

假设我有以下生成文件:

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 ?= $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ')

如果设置,则将使用环境变量,并且仅在未设置或为空时进行计算。

FOOBAR
正在进行计算,因为您正在运行配方(用于
clean
),并且在进入
make
时环境中存在
FOOBAR
。由于进入时环境中存在
FOOBAR
,因此它将成为导出变量,这意味着
make
将其作为环境的一部分提供给配方中的任何程序<代码>制作无特殊情况
回音
;它只使用在您的路径中找到的路径。它不知道该实用程序是否会引用特定的环境变量,因此它必须导出所有导出的变量,这意味着它必须计算
FOOBAR

(官方文字请参见制作手册中的第三段。另请参见上的配方。)

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

unexport FOOBAR