Есть ли различия в вызове переменных с синтаксисом ${var}
и $(var)
? Например, как переменная будет расширяться или что-то в этом роде?
Есть ли различия в вызове переменных с синтаксисом ${var}
и $(var)
? Например, как переменная будет расширяться или что-то в этом роде?
Ответы:
Нет никакой разницы - они означают одно и то же (в GNU Make и в POSIX make).
я так думаю $(round brackets)
выглядит аккуратнее, но это только личные предпочтения.
(Другие ответы указывают на соответствующие разделы документации GNU Make и обратите внимание, что вы не должны смешивать синтаксисы в одном выражении)
deploy: ${DEPS}
для меня как синтаксическая ошибка, но отображается deploy: $(DEPS)
как правильная, хотя оба написания имеют одинаковый эффект при вызове make
.
В разделе " Основы ссылок на переменные " GNU make
документации не указано никаких различий :
Чтобы заменить значение переменной, напишите знак доллара, за которым следует имя переменной в круглых или фигурных скобках: либо,
$(foo)
либо${foo}
является допустимой ссылкой на переменную foo.
Как уже было правильно указано, нет никакой разницы, но будьте осторожны, чтобы не смешивать два типа разделителей, поскольку это может привести к загадочным ошибкам, таким как unomadh GNU make.
Из руководства GNU make по синтаксису вызова функций (выделено мной):
[…] Если сами аргументы содержат вызовы других функций или ссылки на переменные, разумнее всего использовать одинаковые разделители для всех ссылок; пиши
$(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.
Но до сих пор я обнаружил эту разницу только тогда, когда имя переменной в $ {...} содержит запятую. Сначала я подумал, что $ {...} расширяет запятую не как часть значения, но оказалось, что я не могу взломать его таким образом. Я до сих пор этого не понимаю ... Если бы у кого-то были объяснения, я был бы рад узнать!
Стиль $ {} позволяет тестировать правила make в оболочке, если у вас установлены соответствующие переменные среды, поскольку это совместимо с bash.
Имеет значение, если выражение содержит несбалансированные скобки:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Для ссылок на переменные это имеет значение для функций или для имен переменных, содержащих скобки (плохая идея).
$()
in make, чтобы не вызывать у себя путаницы (большей, чем уже существует) между переменными make и оболочки. GNU Make документация по ссылкам на переменные .