Make는 각 쉘 명령을 자체 쉘에서 실행합니다. 그리고 쉘이 종료되면 환경이 손실됩니다.
한 스크립트의 변수를 다음 스크립트에서 사용 가능하게하려면이 작업을 수행 할 구성 요소가 있어야합니다. 예를 들면 다음과 같습니다.
all:
(. ./script1.sh; ./script2.sh)
이렇게하면 단일 셸에서 두 스크립트를 모두 처리 할 수 있습니다.
변수를 두 번째 스크립트에서 볼 수 있도록하려면 변수가 필요합니다. unexported 변수는 로컬 스크립트에서만 사용할 수 있으며 실행되는 하위 셸에서는 사용할 수 없습니다.
UPDATE (Kusalananda의 코멘트 당) : 당신이 당신의 쉘 대신 단지 환경 변수의 변수도하지 채우는 명령을하려면
, 당신은 당신이 만들기의 버전에 따라 옵션이있을 수 있습니다 달리는. 예를 들어, BSD 메이크업과 GNU 만들, 당신은 포함 "변수 할당 수정"을합니다 (BSD 메이크업 남자 페이지에서)를 사용할 수 있습니다 : BSD의 메이크업으로,
!= Expand the value and pass it to the shell for execution and
assign the result to the variable. Any newlines in the result
are replaced with spaces.
따라서 및 GNU 만들, 당신이 할 수 있습니다 :
를 이
이을 공급 되 고, 따라서 호출 쉘에서 실행되고 있기 때문
script1.sh
어떤 말야 포함되지 않습니다 가
$ cat Makefile
foo!= . ./script1.sh; ./script2.sh
all:
@echo "foo=${foo}"
$
$ cat script1.sh
export test=bar
$
$ cat script2.sh
#!/usr/bin/env bash
echo "$test"
$
$ make
foo=bar
$
주, 즉 뭐든간에. 그것은시 뱅 라인을 단지 논평으로 만든다. 기본 쉘이 POSIX이지만 bash (Ubuntu, Solaris, FreeBSD 등)가 아닌 시스템에 있다면 POSIX 쉘이 변수 내보내기의 개념을 모두 이해해야하기 때문에 여전히 작동해야합니다.
그건 잘 작동합니다. 그러나 변수는'(...) '에 의해 생성 된 쉘 외부에서 사용할 수 없습니다. 그것은 OP에 대한 문제가 아닐지도 모르지만 ... 엄밀히 말하면, 그것은 첫 번째 스크립트를 제공하고 두 번째 스크립트를 실행하는'script3.sh'를 갖는 것과 같습니다. 이 시점에서 더 이상 "Makefile 내부"가 아닙니다. – Kusalananda
@Kusalananda - BSD 및 GNU make에서 변수를 생성하는 솔루션으로 업데이트되었습니다. 모든 변형에서 작동하지 않지만 적어도 뭔가 있습니다. :) – ghoti
좋은 해결책입니다. – Kusalananda