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

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



답변

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

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

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


답변

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

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


답변

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

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

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


답변

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

, = ,
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.

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


답변

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


답변

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

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

->

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

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


답변