Makefile에서 괄호 $ ()와 중괄호 $ {} 구문의 차이점은 무엇입니까?


110

구문을 사용 ${var}하여 변수를 호출하는 데 차이가 $(var)있습니까? 예를 들어, 변수가 확장되는 방식이나 어떤 것이 있습니까?

답변:


95

차이는 없습니다. 정확히 같은 의미입니다 (GNU Make와 POSIX make에서).

$(round brackets)깔끔해 보이지만 개인적인 취향 일뿐입니다.

(다른 답변은 GNU Make 문서의 관련 섹션을 가리키며 단일 표현식 내에서 구문을 혼합해서는 안된다는 점에 유의하십시오)


11
나는 $()make와 shell 변수 사이에 혼동을 일으키지 않기 위해 in make를 사용합니다 . GNU 변수 참조에 대한 문서를 만듭니다 .
Etan Reisner 2014-08-07

이 답변에 대한 확장을 제안 해 주신 @Eloy 사용자에게 감사드립니다. 다른 답변에서 귀중한 추가 포인트를 언급하기 위해 그들의 개요를 거부했지만.
Norman Gray

1
일부 도구는 동일성을 존중하지 않을 수 있습니다. IntelliJ IDEA deploy: ${DEPS}는 나에게 구문 오류로 강조 되었지만에서 deploy: $(DEPS)호출 될 때 두 철자가 동일한 효과를 나타내더라도 올바른 것으로 표시 되었습니다 make.
amacleod

45

변수 참조의 기본 섹션 로부터 GNU make문서 상태 차이가 없음 :

변수의 값을 대체하려면 괄호 나 중괄호 변수의 이름 다음에 달러 기호를 쓰기 : 하나 $(foo)또는 ${foo}유효한 참조이다 변수 foo를합니다.


13

이미 올바르게 지적한 바와 같이, 아무런 차이가 없다 하지만 이 같은 비밀 오류가 발생할 수 구분 기호의 두 종류를 혼합하지 않도록주의해야 할 unomadh GNU 메이크 예.

에서 함수 호출 구문에 GNU 메이크 설명서 (강조 광산) :

[…] 인수 자체에 다른 함수 호출이나 변수 참조가 포함되어 있으면 모든 참조에 대해 동일한 종류의 구분 기호를 사용하는 것이 가장 좋습니다. 쓰지 $(subst a,b,$(x))말고 $(subst a,b,${x}). 이는 더 명확 하고 참조의 끝을 찾기 위해 한 가지 유형의 구분 기호 만 일치하기 때문 입니다.


11

실제로는 상당히 다른 것 같습니다.

, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)

출력

a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.

하지만 지금까지 $ {...}의 변수 이름에 쉼표가 포함 된 경우에만이 차이를 발견했습니다. 처음에는 $ {...}가 쉼표를 값의 일부가 아니라 확장한다고 생각했지만이 방법으로 해킹 할 수 없다는 것이 밝혀졌습니다. 아직도 이해가 안 돼요 ... 누구라도 설명을 해주셨 으면 좋겠어요!


GNU가 문서화에 차이가 없다고 언급하는 Edouard의 답변을 기반으로하면 이것이 버그 일 수 있다고 생각합니다.
Keith M

7
Alexandre Perrin의 답변에서 지적했듯이 두 구문이 같은 줄에 혼합되어서는 안됩니다.
lenz

11

$ {} 스타일을 사용하면 bash와 호환되는 환경 변수가 설정되어있는 경우 셸에서 make 규칙을 테스트 할 수 있습니다.


3

표현식에 불균형 대괄호가 포함 된 경우 차이가 있습니다.

${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))

->

:-(
*** insufficient number of arguments (1) to function 'subst'.  Stop.

변수 참조의 경우 함수 나 대괄호가 포함 된 변수 이름 (나쁜 ​​생각)에 차이가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.