无法导出' SHELL'变量
docs读取:
此外,当你设置' SHELL'在你的makefile中,值是 不在环境中导出到制作'调用。 相反,从用户的环境继承的值(如果有的话)是 出口。您可以通过显式导出来覆盖此行为 ' SHELL' (*注意将变量传达给子 - ' make': 变量/递归。),强制它在环境中传递给 食谱线。
进一步elsewhere,我们有:
'制作'变量' SHELL'不会导出。代替, ' SHELL'的价值来自调用环境的变量是 传递给子'制作'。你可以强制制作'输出其价值 ' SHELL'通过使用' export'指令,如下所述。
ifeq "$(MAKELEVEL)" "0"
export SHELL
all:
@$(MAKE)
else
all:
@-foo;
endif
.PHONY: all
以:
运行$ make SHELL=bash -e
我们得到:
make[1]: Entering directory '/home/myname'
/bin/sh: 1: foo: not found
makefile:13: recipe for target 'all' failed
make[1]: [all] Error 127 (ignored)
make[1]: Leaving directory '/home/myname'
如果仔细查看上面的第2行,您会看到默认(/bin/sh
)shell执行了命令。
现在,尽管上面引用的文档建议SHELL变量有明确的export
。为什么呢?
制作版本是最新的!
答案 0 :(得分:1)
这有点奇怪。问题是你正在使用-e
(允许环境变量覆盖make变量)。如果你不使用那个标志,那么它按预期工作。
当您指定-e
时,子make会获得SHELL
的导出值,并确实将该值传递给其命令,但它使用/bin/sh
本身来运行命令。
考虑这个makefile:
ifeq "$(MAKELEVEL)" "0"
export SHELL
all: ; @env | grep ^SHELL; $(MAKE)
else
$(info submake SHELL = $(SHELL))
all: ; @-env | grep ^SHELL; foo
endif
.PHONY: all
现在,如果我们在没有-e
的情况下运行,我们会得到我们期望的结果:
$ make SHELL=bash
SHELL=bash
submake SHELL = bash
SHELL=bash
bash: foo: command not found
Makefile:10: recipe for target 'all' failed
make[1]: [all] Error 127 (ignored)
但是如果我们使用-e
运行,那么所有值都与导出的SHELL
值相同,但子品牌使用/bin/sh
来运行食谱:
$ make -e SHELL=bash
SHELL=bash
submake SHELL = /bin/sh
SHELL=bash
/bin/sh: foo: command not found
Makefile:10: recipe for target 'all' failed
make[1]: [all] Error 127 (ignored)
我不确定为什么-e
会产生这种影响;我需要查看代码。