Y a-t-il des différences dans l'appel de variables avec la syntaxe ${var}
et $(var)
? Par exemple, dans la manière dont la variable sera développée ou quoi que ce soit?
Y a-t-il des différences dans l'appel de variables avec la syntaxe ${var}
et $(var)
? Par exemple, dans la manière dont la variable sera développée ou quoi que ce soit?
Réponses:
Il n'y a pas de différence - ils signifient exactement la même chose (dans GNU Make et POSIX make).
Je pense que cela a l' $(round brackets)
air plus ordonné, mais c'est juste une préférence personnelle.
(D'autres réponses pointent vers les sections pertinentes de la documentation GNU Make, et notez que vous ne devriez pas mélanger les syntaxes dans une seule expression)
deploy: ${DEPS}
en évidence comme une erreur de syntaxe pour moi, mais s'est montré deploy: $(DEPS)
correct, même si les deux orthographes ont le même effet lorsqu'elles sont invoquées dans make
.
Les bases de références Variable section de l' GNU make
état de la documentation aucune différence :
Pour remplacer la valeur d'une variable, écrivez un signe dollar suivi du nom de la variable entre parenthèses ou accolades: soit
$(foo)
ou${foo}
est une référence valide à la variable toto.
Comme déjà correctement souligné, il n'y a pas de différence mais faites attention à ne pas mélanger les deux types de délimiteurs car cela peut conduire à des erreurs cryptiques comme unomadh GNU make example.
Du manuel GNU make sur la syntaxe des appels de fonction (c'est moi qui souligne):
[…] Si les arguments eux-mêmes contiennent d'autres appels de fonction ou références de variables, il est plus sage d'utiliser le même type de délimiteurs pour toutes les références; écrire
$(subst a,b,$(x))
, non$(subst a,b,${x})
. C'est parce qu'il est plus clair et qu'un seul type de délimiteur est mis en correspondance pour trouver la fin de la référence .
En fait, cela semble être assez différent:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
les sorties
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
Mais jusqu'à présent, je n'ai trouvé cette différence que lorsque le nom de la variable dans $ {...} contient lui-même une virgule. J'ai d'abord pensé que $ {...} étendait la virgule non comme une valeur, mais il s'avère que je ne suis pas capable de le pirater de cette façon. Je ne comprends toujours pas ça ... Si quelqu'un avait une explication, je serais heureux de savoir!
Le style $ {} vous permet de tester les règles de fabrication dans le shell, si vous avez défini les variables d'environnement correspondantes, car cela est compatible avec bash.
Cela fait une différence si l'expression contient des crochets non équilibrés:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Pour les références de variables, cela fait une différence pour les fonctions, ou pour les noms de variables qui contiennent des crochets (mauvaise idée)
$()
in make pour éviter de me créer une confusion (plus que ce qui existe déjà) entre les variables make et shell. GNU Make documentation sur les références de variables .