Makefile'da parantez $ () ile küme parantez $ {} sözdizimi arasındaki fark nedir?


111

Sözdizimi değişkenleri çağrılırken herhangi bir fark var mı ${var}ve $(var)? Örneğin, değişkenin genişletilme biçiminde veya herhangi bir şey?

Yanıtlar:


95

Fark yok - bunlar tamamen aynı anlama geliyor (GNU Make ve POSIX make'de).

Sanırım bu $(round brackets)daha düzenli görünüyor, ama bu sadece kişisel tercih.

(Diğer yanıtlar, GNU Make belgelerinin ilgili bölümlerine işaret eder ve sözdizimlerini tek bir ifadede karıştırmamanız gerektiğini unutmayın)


11
$()Make ve shell değişkenleri arasında kendimi karıştırmaktan (zaten mevcut olandan daha fazla) kaçınmak için in make'i kullanıyorum . GNU Değişken başvurularla ilgili belgeler oluşturun .
Etan Reisner

Bu cevaba genişleme önerdiği için @Eloy kullanıcısına teşekkürler, ancak diğer cevaplardaki değerli ekstra noktaları not etme lehine onların özetini reddetmeme rağmen.
Norman Grey

1
Bazı araçlar aynılıklarına saygı göstermeyebilir. IntelliJ IDEA deploy: ${DEPS}benim için bir sözdizimi hatası olarak vurgulandı , ancak deploy: $(DEPS)her iki yazımın da çağrıldığında aynı etkiye sahip olmasına rağmen doğru olduğunu gösterdi make.
amacleod


14

Zaten doğru bir şekilde belirtildiği gibi, bir fark yoktur, ancak iki tür sınırlayıcıyı karıştırmamaya dikkat edin çünkü bu, unomadh GNU'nun örnek yaptığı gibi şifreli hatalara yol açabilir .

Gönderen Function Çağrı sözdizimi üzerine GNU yapmak kılavuzuna (vurgu benim):

[…] Argümanların kendileri başka işlev çağrıları veya değişken referansları içeriyorsa, tüm referanslar için aynı tür sınırlayıcıları kullanmak en akıllıca olacaktır; yaz $(subst a,b,$(x)), değil $(subst a,b,${x}). Bunun nedeni, daha net olması ve referansın sonunu bulmak için yalnızca bir tür sınırlayıcının eşleştirilmesidir .


11

Aslında oldukça farklı görünüyor:

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

çıktılar

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

Ama şimdiye kadar bu farkı sadece $ {...} değişkeninin adı virgül içerdiğinde buldum. İlk önce $ {...} değerinin bir parçası olarak virgül genişlettiğini düşünmüştüm, ama bu şekilde kesemeyeceğim ortaya çıktı. Hala bunu anlamıyorum ... Birinin bir açıklaması olsaydı, bilmek isterim!


GNU'nun dokümantasyonda hiçbir fark olmadığını belirten Edouard'ın cevabına dayanarak, bunun bir hata olabileceğini tahmin ediyorum.
Keith M

8
Alexandre Perrin'in cevabında belirtildiği gibi, iki sözdizimi aynı satırda karıştırılmamalıdır.
lenz

11

$ {} Stili, bash ile uyumlu olduğundan, karşılık gelen ortam değişkenlerine sahipseniz, kabukta yapma kurallarını test etmenizi sağlar.


3

İfadenin dengesiz parantez içermesi bir fark yaratır:

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

->

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

Değişken referanslar için bu, işlevler için veya parantez içeren değişken adları için bir fark yaratır (kötü fikir)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.