Shell 如何设置子进程';Makefile中的环境变量

Shell 如何设置子进程';Makefile中的环境变量,shell,makefile,environment-variables,target,Shell,Makefile,Environment Variables,Target,我想更改此生成文件: SHELL := /bin/bash PATH := node_modules/.bin:$(PATH) boot: @supervisor \ --harmony \ --watch etc,lib \ --extensions js,json \ --no-restart-on error \ lib test: NODE_

我想更改此生成文件:

SHELL := /bin/bash
PATH  := node_modules/.bin:$(PATH)

boot:
    @supervisor         \
      --harmony         \
      --watch etc,lib       \
      --extensions js,json      \
      --no-restart-on error     \
        lib

test:
    NODE_ENV=test mocha         \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean
致:

不幸的是,第二个节点不起作用(节点进程仍然使用默认的
node\u ENV
运行)


我遗漏了什么?

默认情况下,Make变量不会导出到进程Make invokes的环境中。但是,您可以使用Make的
导出
强制它们这样做。更改:

test: NODE_ENV = test
为此:

test: export NODE_ENV = test

(假设您有一个足够现代的GNU make>=3.77版本)。

我只需要本地的环境变量来调用我的测试命令,下面是一个在bash shell中设置多个环境变量并转义美元登录
make
的示例

SHELL := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/
如所示,您可以通过以下方式导出单个变量:

export MY_VAR = foo  # Available for all targets
或导出特定目标()的变量:


您还可以指定
。将所有变量导出到您猜到的目标!-导出所有内容!!!:

.EXPORT_ALL_VARIABLES:

MY_VAR_1 = foo
MY_VAR_2 = bar
MY_VAR_3 = baz

test:
  @echo $$MY_VAR_1 $$MY_VAR_2 $$MY_VAR_3

请参见

我将重新编写原始目标测试,注意所需的变量在与要启动的应用程序相同的子流程中定义:

test:
    ( NODE_ENV=test mocha --harmony --reporter spec test )

我有GNU make 3.81和
all:export PROJ_ROOT=$(CURDIR)echo$(PROJ_ROOT)
为第一行输出正确的扩展名,但为第二行只输出
echo
PROJ_ROOT
在运行make后未设置。
=
周围的空格给出“错误的变量名”用于导出。如示例中所示,将第一行作为先决条件将给出“在第一个目标之前开始命令”@Gauthier是的,当然。这不是我写的。你在
all:
之后添加了一个,这不在我的示例中。我的示例旨在作为书面形式使用:它定义一个特定于目标的变量,而不是向配方中添加命令。此外,你不能同时在目标上使用配方和特定于目标的变量:你必须写两次目标。请参阅问题中的第二个示例,如果这无助于解释问题,请提出一个新问题:注释中没有足够的空间或格式。多个变量如何?这很好,但您已将其添加到目标的头部。仅在目标的上下文中列出它们是不起作用的?因为它不适用于MetaTarget speci在GNU make 3.77中添加了fic变量。它们在GNU make 3.81中可导出。请参见编辑您的答案以包含一些解释。仅代码的答案对未来SO读者的教育作用不大。您的答案因质量低下而处于审核队列中。ThorCaller,此解决方案不如上述方法灵活。例如,您可能希望有一个用于调用命令的规则,然后有几个其他规则通过设置环境变量来修改该行为。请考虑:test:cmd perf:export perf=“yes”perf:test如果“cmd”很复杂(通常是这样),则此方法更易于维护。您在cmd规则中设置环境变量的方法使此操作更为困难。奇怪的是,我之前对其进行了测试,结果表明它有效….(不确定为什么现在….)我可以返回并删除我猜的注释。@AnthonyC它之所以有效,是因为有两个
myu-VAR
s:一个是作为
${myu-VAR}访问的makefile变量
另一个是bash exported variable,作为
$$MY_VAR
访问非常有用。但是找不到只导出一组变量的方法。请注意,如果makefile中已经存在该变量,并且您只想将其导出到另一个命令,则可以使用语法
export VAR?=
而不指定新值自然地,注释源于环境变量与
Makefile
变量之间的误解。证明已设置环境变量的最佳方法是在另一个
make
wil调用的程序中查询此环境变量。仅执行
echo$(废话)
只是在Makefile中评估Makefile的键/值机制。在python中,您可以
打印(os.getenv(“MURDOC”)
来真正查询环境变量。
.EXPORT_ALL_VARIABLES:

MY_VAR_1 = foo
MY_VAR_2 = bar
MY_VAR_3 = baz

test:
  @echo $$MY_VAR_1 $$MY_VAR_2 $$MY_VAR_3
test:
    ( NODE_ENV=test mocha --harmony --reporter spec test )