make: Unterschied zw. $(x) und ${x}

Moderator Persönliche Seite #2168178
Lesenswert?
• ▲
▼
$(...) ist älter; Volume 2 des V7 UNIX Handbuchs hat eine Abhandlung
über make, die nur diese Form erwähnt.

Wer wann und warum ${...} eingeführt hat, ist allerdings nicht ohne
weiteres herauszufinden.  Alle aktuellen make-Implementierungen (GNU
make, SysV make, BSD make) kennen beide Formen, und die Single UNIX
Specification (SUSp) schreibt dies auch so vor.
Moderator #2168372
Lesenswert?
• ▲
▼
Hier ist ein echtes Real-World-Beispiel, wo $() ein anderes Ergebnis
liefert als ${}:
1
(*o*)    = clown
2
{o|o}    = martian
3
{°(_)°}  = koala
4

5
GOOD = ${(*o*)} and $({o|o})      # richtig geklammert
6
BAD1 = $((*o*)) and ${{o|o}}      # falsch geklammert
7
BAD2 = $({°(_)°}) and ${{°(_)°}}  # dumm aber auch, wie klammert
8
                                  # man denn den Koala richtig?
9

10
all:
11
  @echo "good: $(GOOD)"
12
  @echo "bad1: $(BAD1)"
13
  @echo "bad2: $(BAD2)"

Ausgabe:
1
$ make
2
good: clown and martian     
3
bad1: ) and }     
4
bad2: °}) and }

Ein klein wenig eher kommt es vielleicht vor, dass in einem subst oder
einem conditional ein String-Argument eine Klammer enthält.
Moderator #2168678
Lesenswert?
• ▲
▼
Jörg Wunsch schrieb:
>> Hier ist ein echtes Real-World-Beispiel
>
> Naja, ein reichlich unportables.  Posix, ähem, SUSPv2 meint dazu:
>
> "Applications must select macro names from the set of characters
> consisting solely of periods, underscores, digits and alphabetics from
> the portable character set ..."

Och, das ist aber schade. Dann sind also ausdrucksstarke Variablennamen
verboten? Solche technich völlig unbegründeten Einschränkungen erinnern
mich irgendwie an Windows & Co.

GNU-Make gefällt mir da viel besser:

  "A variable name may be any sequence of characters not containing ‘:’,
  ‘#’, ‘=’, or leading or trailing whitespace."

Das folgende, aus drei Zeichen bestehende und nicht einmal in GNU-Make
als Variablenname zulässige Symbol bezieht sich auf meinen Beitrag bis
hierher: ;-)

Hier ist noch ein (wenn auch etwas an den Haaren herbeigezogenes)
Beispiel, wo auch in einem SUSv2-konformen Makefile die geschweiften
Klammern benötigt werden:
1
a = f(x)
2
b = ${a:x)=y)}  # liefert f(y)
3

4
all:
5
  @echo "$(b)"
Moderator Persönliche Seite #2168692
Lesenswert?
• ▲
▼
Yalu X. schrieb:

> Solche technich völlig unbegründeten Einschränkungen erinnern
> mich irgendwie an Windows & Co.

Solchen "technich völlig unbegründeten Einschränkungen" unterliegen
allerdings Bezeichnernamen in praktisch allen Programmiersprachen,
und groß was anderes ist ein make-Makroname ja auch nicht.

> GNU-Make gefällt mir da viel besser:

Creeping featurism ist ja nun (leider) nicht gerade untypisch für
GNU-Tools.

> Hier ist noch ein (wenn auch etwas an den Haaren herbeigezogenes)
> Beispiel, wo auch in einem SUSv2-konformen Makefile die geschweiften
> Klammern benötigt werden:

Wobei man dieses natürlich genausogut umgekehrt schreiben kann.  Das
würde also lediglich begründen, warum zwei verschiedene Klammerpaare
als Alternativen sinnvoll sind ... erinnert mich aber an Quoting-
Orgien in der Shell, wenn man auf diese Weise beliebig komplexe
(und beliebig unsinnige ;) Szenarien konstruieren will.
Moderator #2168713
Lesenswert?
• ▲
▼
Jörg Wunsch schrieb:
> Das würde also lediglich begründen, warum zwei verschiedene
> Klammerpaare als Alternativen sinnvoll sind

Mehr wollte ich auch gar nicht. Es ging nur darum,

> Wer wann und warum ${...} eingeführt hat

Auf das Wer und Wann habe ich auch keine Antwort parat, aber das Warum
könnte mit den angeführten Beispielen zumindest teilweise beantwortet
werden.
Moderator #2168919
Lesenswert?
• ▲
▼
Jörg Wunsch schrieb:
> Meine Vermutung wäre allerdings eine andere: Variablen in der Shell
> werden auch mit ${...} geklammert […], und man wollte irgendwie wenig
> "visuelle Umgewöhnung" ermöglichen.

An so etwas hatte ich ursprünglich auch gedacht. Allerdings werden die
Klammern in Shell-Skripten meistens weggelassen, was aber in Makefiles
meistens nicht möglich ist, so dass die Umgewöhnung nur unwesentlich
erleichtert wird.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.