태그 보관물: shell

shell

Makefile에서 자식 프로세스의 환경 변수를 설정하는 방법

이 Makefile을 변경하고 싶습니다.

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

에:

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
test:
    mocha                   \
      --harmony             \
      --reporter spec       \
        test

clean:
    @rm -rf node_modules

.PHONY: test clean

불행히도 두 번째는 작동하지 않습니다 (노드 프로세스는 여전히 기본값으로 실행됩니다) NODE_ENV.

내가 놓친 게 무엇입니까?



답변

Make 변수는 기본적으로 프로세스 호출 환경으로 내 보내지 않습니다. 그러나 make를 사용 export하여 강제로 그렇게 할 수 있습니다. 변화:

test: NODE_ENV = test

이에:

test: export NODE_ENV = test

(당신은 충분히 현대적인 GNU make> = 3.77 버전을 가지고 있다고 가정합니다).


답변

매드 사이언티스트는 지적 , 당신은 개별 변수를 내보낼 수 있습니다 :

export MY_VAR = foo  # Available for all targets

또는 특정 대상에 대한 변수를 내보내십시오 ( 대상별 변수 ).

my-target: export MY_VAR_1 = foo
my-target: export MY_VAR_2 = bar
my-target: export MY_VAR_3 = baz

my-target: dependency_1 dependency_2
  echo do something

.EXPORT_ALL_VARIABLES대상을 지정하여 추측 한대로 지정할 수도 있습니다. 모든 것을 내 보냅니다 !!! :

.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

.EXPORT_ALL_VARIABLES 참조


답변

테스트 명령을 호출하기 위해 로컬 환경 변수 만 필요했습니다. 여기 bash 쉘에서 여러 환경 변수를 설정하고 달러 기호를 이스케이프 처리하는 예제가 make있습니다.

SHELL := /bin/bash

.PHONY: test tests
test tests:
    PATH=./node_modules/.bin/:$$PATH \
    JSCOVERAGE=1 \
    nodeunit tests/