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