¿Hay alguna diferencia al invocar variables con sintaxis ${var}
y $(var)
? Por ejemplo, ¿en la forma en que se expandirá la variable o algo así?
¿Hay alguna diferencia al invocar variables con sintaxis ${var}
y $(var)
? Por ejemplo, ¿en la forma en que se expandirá la variable o algo así?
Respuestas:
No hay diferencia: significan exactamente lo mismo (en GNU Make y en POSIX make).
Creo que se $(round brackets)
ve más ordenado, pero eso es solo una preferencia personal.
(Otras respuestas apuntan a las secciones relevantes de la documentación de GNU Make y tenga en cuenta que no debe mezclar las sintaxis en una sola expresión)
deploy: ${DEPS}
como un error de sintaxis para mí, pero se mostró deploy: $(DEPS)
como correcto, aunque ambas ortografías tienen el mismo efecto cuando se invoca make
.
La sección Conceptos básicos de referencias de variables de la GNU make
documentación no indica diferencias :
Para sustituir el valor de una variable, escriba un signo de dólar seguido del nombre de la variable entre paréntesis o corchetes: bien
$(foo)
o${foo}
es una referencia válida para la variable foo.
Como ya se señaló correctamente, no hay diferencia, pero tenga cuidado de no mezclar los dos tipos de delimitadores, ya que puede llevar a errores crípticos como unomadh GNU make example.
Del manual GNU make sobre la sintaxis de llamadas a funciones (el énfasis es mío):
[…] Si los argumentos en sí contienen otras llamadas a funciones o referencias a variables, es mejor usar el mismo tipo de delimitadores para todas las referencias; escribir
$(subst a,b,$(x))
, no$(subst a,b,${x})
. Esto se debe a que es más claro y a que solo se hace coincidir un tipo de delimitador para encontrar el final de la referencia .
En realidad, parece ser bastante diferente:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
salidas
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
Pero hasta ahora solo encontré esta diferencia cuando el nombre de la variable en $ {...} contiene una coma. Primero pensé que $ {...} estaba expandiendo la coma no como parte del valor, pero resulta que no puedo hackearlo de esta manera. Sigo sin entender esto ... Si alguien tuviera una explicación, ¡estaría feliz de saberlo!
El estilo $ {} le permite probar las reglas de creación en el shell, si tiene configuradas las variables de entorno correspondientes, ya que es compatible con bash.
Hace una diferencia si la expresión contiene corchetes no balanceados:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Para referencias de variables, esto marca la diferencia para funciones o para nombres de variables que contienen corchetes (mala idea)
$()
in make para evitar causarme confusión (más de la que ya existe) entre las variables make y shell. GNU Make documentación sobre referencias variables .