2016-06-23 2 views
0

이전 명령 (Makefile 내부)에서 선언 한 변수에 액세스하려고합니다. 여기 Makefile 명령 내에서 선언 된 액세스 변수

Makefile입니다 :

#!/usr/bin/env bash 
myVar=1234 
다음

스크립트가 변수 이전에 정의 된 액세스하려고, script2.sh :

all: 
    ./script1.sh 
    ./script2.sh 

여기에 액세스하려는 변수, script1.sh를 선언 스크립트의

#!/usr/bin/env bash 
echo $myVar 

유엔 다행히도 make을 실행하면 myVar에 액세스 할 수 없습니다. 다른 방법이 있습니까? 감사.

답변

2

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 쉘이 변수 내보내기의 개념을 모두 이해해야하기 때문에 여전히 작동해야합니다.

+0

그건 잘 작동합니다. 그러나 변수는'(...) '에 의해 생성 된 쉘 외부에서 사용할 수 없습니다. 그것은 OP에 대한 문제가 아닐지도 모르지만 ... 엄밀히 말하면, 그것은 첫 번째 스크립트를 제공하고 두 번째 스크립트를 실행하는'script3.sh'를 갖는 것과 같습니다. 이 시점에서 더 이상 "Makefile 내부"가 아닙니다. – Kusalananda

+1

@Kusalananda - BSD 및 GNU make에서 변수를 생성하는 솔루션으로 업데이트되었습니다. 모든 변형에서 작동하지 않지만 적어도 뭔가 있습니다. :) – ghoti

+0

좋은 해결책입니다. – Kusalananda

1

두 개의 스크립트를 별도로 호출하면 두 개의 개별 환경이 작성됩니다. 첫 번째 스크립트는 환경 변수를 설정하고 종료합니다 (환경은 손실됩니다). 두 번째 스크립트는 해당 환경에 해당 변수가 없으므로 빈 문자열을 출력합니다.

환경 변수가 상위 쉘 환경에서 하위 쉘 환경으로 전달되는 것을 허용 할 수 없습니다 (그 반대가 아닙니다). 자식 셸로 전달 된 변수는 부모 셸에있는 변수는 export -ed입니다. 따라서 첫 번째 스크립트가 두 번째 스크립트를 호출하면 값이 출력됩니다 (첫 번째 스크립트에서 export -ed 인 경우).

셸에서 source은 현재 환경에서 변수를 설정하는 첫 번째 파일입니다 (그리고 export!). 그러나 Makefiles에서는 편리한 source 명령이 없으므로 조금 까다 롭습니다.

대신 this StackOverflow question을 읽을 수도 있습니다. 의 빛

EDIT @의 ghoti의 대답 : @ghoti은 좋은 해결책을 가지고 있지만 그들과 함께 할이 환경 변수에 대해 더 자세하게 좀 설명으로 여기에 내 대답을 떠날거야 그리고 우리가 할 수있는 일이 아니라 환경간에 전달하는 것과 관련하여

+0

그게 내 생각에, 많이 감사합니다. – julesbou