Яка різниця між синтаксисом дужок $ () і фігурним дужкою $ {} у Makefile?


110

Чи є різниці у виклику змінних із синтаксисом ${var}та $(var)? Наприклад, способом розширення змінної чи нічого?

Відповіді:


95

Немає різниці - вони означають абсолютно однакове (в GNU Make і в POSIX make).

Я думаю, що це $(round brackets)виглядає акуратніше, але це лише особисті переваги.

(Інші відповіді вказують на відповідні розділи документації GNU Make, і зауважте, що не слід змішувати синтаксиси в одному виразі)


11
Я використовую $()in make, щоб не створювати плутанину (більше, ніж уже існує) між змінними make і shell. GNU Складіть документацію на змінні посилання .
Ітан Рейснер

Дякую користувачеві @Eloy за те, що він запропонував розширити цю відповідь, навіть якщо я відхилив їхній збірник на користь просто зазначити цінні додаткові бали в інших відповідях.
Норман Грей

1
Деякі інструменти можуть не шанувати їх однаковість. IntelliJ IDEA виділив deploy: ${DEPS}як синтаксичну помилку для мене, але показав себе deploy: $(DEPS)як правильний, навіть якщо обидва написання мають однаковий ефект при виклику в make.
amacleod

45

В Основах Variable Посилання розділу від GNU makeстану документації немає відмінностей :

Для підстановки значення змінної, напишіть знак долара з подальшим ім'ям змінної в круглих або фігурних дужках: або $(foo)або ${foo}є допустимою посиланням на змінну взувши.


13

Як уже правильно зазначалося, немає різниці, але будьте обережні, щоб не змішувати два розділювачі, оскільки це може призвести до критичних помилок, як, наприклад, Unomadh GNU.

З GNU складіть керівництво по синтаксису функціонального виклику (міна акценту):

[…] Якщо самі аргументи містять інші виклики функцій або змінні посилання, найрозумніше використовувати однаковий тип роздільників для всіх посилань; писати $(subst a,b,$(x)), ні $(subst a,b,${x}). Це тому, що це чіткіше і тому, що для пошуку кінця посилання підбирається лише один тип роздільника .


11

Насправді це здається досить різним:

, = ,
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.

Але поки що я знайшов цю різницю лише тоді, коли ім'я змінної в $ {...} містить себе кома. Я спочатку подумав, що $ {...} розширює кому не як частину, а значення, але виявляється, я не в змозі зламати її таким чином. Я досі цього не розумію ... Якби хтось мав пояснення, я був би радий знати!


Виходячи з відповіді Едуарда, в якій зазначається, що GNU в документації стверджує, що немає різниці, я думаю, це може бути просто помилка.
Кіт М

7
Як вказувалося у відповіді Олександра Перріна, два синтаксиси не повинні змішуватися в одному рядку.
lenz

11

Стиль $ {} дозволяє перевірити правила створення в оболонці, якщо у вас встановлені відповідні змінні середовища, оскільки це сумісно з bash.


3

Це має значення, якщо вираз містить незбалансовані дужки:

${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))

->

:-(
*** insufficient number of arguments (1) to function 'subst'.  Stop.

Для змінних посилань це має значення для функцій або для імен змінних, які містять дужки (неправильна ідея)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.