makefile 대상에서 env 변수 사용

makefile 대상에서 env 변수 사용

makefile에서 환경 변수를 사용하는 방법을 알아내려고 합니다. 다음 단계를 수행해야 하는 특정 사용 사례가 있습니다.

  1. 명령 1 실행
  2. command2의 출력을 env 변수에 할당합니다.
  3. command3을 실행하여 2단계에서 할당된 환경 변수를 읽습니다.

위의 단계를 구현하는 makefile은 다음과 같습니다. 그러나 실행하면 빈 변수가 인쇄됩니다. 내가 뭘 잘못했나요? Bash에서 이 명령을 실행하면 제대로 작동합니다)

답변1

달러 기호는 make에서 사용되므로 쉘에 전달하려면 달러 기호를 이스케이프 처리해야 합니다. 두 배로 늘리면 됩니다.

test:
        @bash -c "\
        echo 'need to run some program before assigning env variable';\
        echo 'The make CC variable is set to :${CC}:';\
        export TEST=\"\$$(date)\";\
        echo 'printing env';\
        echo \$${TEST};\
        "

testwithout:
        @echo 'need to run some program before assigning env variable';\
        echo 'The make CC variable is set to :${CC}:';\
        export TEST="$$(date)";\
        echo 'printing env';\
        echo $${TEST};

문자열을 두 번 해석하면 다른 문제가 발생합니다. make레시피를 얻고, 시퀀스를 백슬래시와 개행 문자로 변환하고, 실행을 위해 결과를 셸에 제공합니다. 큰 따옴표를 사용하면 bash -c " .... "쉘이 달러 기호를 확장하므로 `bash -c "echo 'need ...' ;export TEST=Mon Sep...; echo ;"로 끝납니다. 일부 백슬래시 문자를 추가하면 달러 기호와 내부 큰따옴표가 보호됩니다.

bash -c비표적 테스트에서 표시된 것처럼 .를 사용할 필요가 없을 수도 있습니다 . 여전히 명령을 한 줄로 작성해야 합니다. Gnu make에는 .ONESHELL논리 라인당 하나의 쉘이 아닌 단일 쉘을 사용하여 레시피를 실행하는 기능이 있으므로 왜곡을 피할 수 있습니다.

관련 정보