未能导出' SHELL'变量

时间:2015-08-07 05:47:02

标签: makefile

无法导出' 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。为什么呢?

制作版本是最新的!

1 个答案:

答案 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会产生这种影响;我需要查看代码。