Ci sono differenze nell'invocare variabili con sintassi ${var}
e $(var)
? Ad esempio, nel modo in cui verrà espansa la variabile o altro?
Ci sono differenze nell'invocare variabili con sintassi ${var}
e $(var)
? Ad esempio, nel modo in cui verrà espansa la variabile o altro?
Risposte:
Non c'è differenza - significano esattamente lo stesso (in GNU Make e in POSIX make).
Penso che sia $(round brackets)
più ordinato, ma è solo una preferenza personale.
(Altre risposte indicano le sezioni pertinenti della documentazione di GNU Make e nota che non dovresti mescolare le sintassi all'interno di una singola espressione)
deploy: ${DEPS}
come un errore di sintassi per me, ma mostrato deploy: $(DEPS)
come corretto, anche se entrambe le ortografie hanno lo stesso effetto quando invocate in make
.
I principi fondamentali di variabile Riferimenti sezione dalla GNU make
stato di documentazione di differenze :
Per sostituire il valore di una variabile, scrivi un segno di dollaro seguito dal nome della variabile tra parentesi o parentesi graffe: o
$(foo)
o${foo}
è un riferimento valido alla variabile pippo.
Come già correttamente sottolineato, non vi è alcuna differenza, ma attenzione a non mischiare i due tipi di delimitatori poiché può portare a errori criptici come unomadh GNU per esempio.
Dal manuale GNU make sulla sintassi della chiamata di funzione (enfasi mia):
[…] Se gli argomenti stessi contengono altre chiamate a funzioni o riferimenti a variabili, è più saggio usare lo stesso tipo di delimitatori per tutti i riferimenti; scrivi
$(subst a,b,$(x))
, no$(subst a,b,${x})
. Questo perché è più chiaro e perché viene trovato un solo tipo di delimitatore per trovare la fine del riferimento .
In realtà, sembra essere abbastanza diverso:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
uscite
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
Ma finora ho trovato questa differenza solo quando il nome della variabile in $ {...} contiene una virgola. All'inizio pensavo che $ {...} non espandesse la virgola come parte del valore, ma si scopre che non sono in grado di hackerarlo in questo modo. Continuo a non capire ... Se qualcuno avesse una spiegazione, sarei felice di saperlo!
Lo stile $ {} ti consente di testare le regole make nella shell, se hai impostato le variabili di ambiente corrispondenti, poiché è compatibile con bash.
Fa differenza se l'espressione contiene parentesi non bilanciate:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Per i riferimenti alle variabili, questo fa la differenza per le funzioni o per i nomi delle variabili che contengono parentesi (pessima idea)
$()
make per evitare di crearmi confusione (più di quanto già esiste) tra le variabili make e shell. GNU Crea documentazione sui riferimenti alle variabili .