Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
Makefile 为什么';不让未报告的指令起作用?_Makefile - Fatal编程技术网

Makefile 为什么';不让未报告的指令起作用?

Makefile 为什么';不让未报告的指令起作用?,makefile,Makefile,我希望unexportmake指令取消设置变量。从网上阅读来看,这似乎是它应该做的: 如果要防止导出变量,请使用unexport指令,如下所示: 未导出变量 所以我举了一个小例子。在我的第一次运行中,未设置条,并且正如预期的那样,未打印任何内容;但是,我设置了一个环境变量。我希望不会打印任何内容,因为我使用的是unexport指令,除了值dogs仍然会被打印 $ cat Makefile unexport BAR foo: @echo BAR=$(BAR) $ make BAR= $

我希望
unexport
make指令取消设置变量。从网上阅读来看,这似乎是它应该做的:

如果要防止导出变量,请使用unexport指令,如下所示:

未导出变量

所以我举了一个小例子。在我的第一次运行中,未设置
,并且正如预期的那样,未打印任何内容;但是,我设置了一个环境变量。我希望不会打印任何内容,因为我使用的是
unexport
指令,除了值
dogs
仍然会被打印

$ cat Makefile
unexport BAR

foo:
    @echo BAR=$(BAR)
$ make
BAR=
$ export BAR=dogs
$ make
BAR=dogs
$ uname -a
Darwin Maxs-MacBook-Pro-Work.local 19.2.0 Darwin Kernel Version 19.2.0: Sat Nov  9 03:47:04 PST 2019; root:xnu-6153.61.1~20/RELEASE_X86_64 x86_64
$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0
$ man make | grep unexport

这是怎么回事?为什么狗还在打印?

取消导出
ing变量不会删除它,它只是。。。好。。。取消报告。它不在子进程的环境中(当
make
实际上启动子进程时);这并不意味着它根本不存在。如果希望效果可见,请让您的目标运行
env
,或者类似于
bash-c'declare-p BAR'
。使用
env | grep'^BAR=';如果为true,则不会将
条形图
导出到子流程(
env
)。需要
true
,因为
grep
env
的输出中找不到
BAR
时失败。在macOS Mojave 10.14.6上测试。注释掉
unexport
行,并为
BAR
设置值(显式地在命令行上或在环境中),输出包括
BAR=
。首先取消导出变量,它不在输出中,然后显式导出它,它在输出中。您还期望什么?我期望Makefile中的unexport指令取消导出我在shell中导出的变量。如果unexport指令没有取消导出变量,那么unexport指令的目的是什么?从已执行进程的env中取消导出变量。例如,使用Make(非环境)变量,它会将
echobar=dogs
传递给执行配方的shell。但是,如果您将其更改为:
@echo BAR=$${BAR}
,将告诉shell:
@echo BAR=${BAR}
,这将使您
BAR=
不导出变量。
取消导出变量不会删除它,它只是。。。好。。。取消报告。它不在子进程的环境中(当
make
实际上启动子进程时);这并不意味着它根本不存在。如果希望效果可见,请让您的目标运行
env
,或者类似于
bash-c'declare-p BAR'
。使用
env | grep'^BAR=';如果为true,则不会将
条形图
导出到子流程(
env
)。需要
true
,因为
grep
env
的输出中找不到
BAR
时失败。在macOS Mojave 10.14.6上测试。注释掉
unexport
行,并为
BAR
设置值(显式地在命令行上或在环境中),输出包括
BAR=
。首先取消导出变量,它不在输出中,然后显式导出它,它在输出中。您还期望什么?我期望Makefile中的unexport指令取消导出我在shell中导出的变量。如果unexport指令没有取消导出变量,那么unexport指令的目的是什么?从已执行进程的env中取消导出变量。例如,使用Make(非环境)变量,它会将
echobar=dogs
传递给执行配方的shell。但是,如果您将其更改为:
@echo BAR=$${BAR}
,将告诉shell:
@echo BAR=${BAR}
,这将使您得到
BAR=
,并且变量不会被导出。