Forum: Compiler & IDEs make: Unterschied zw. $(x) und ${x}


von Klaus (Gast)


Lesenswert?

Ich habe ein fremdes make Skript in dem sowohl $(x) als auch ${x} 
auftauchen. Auf den ersten Blick erkenne ich keinen funktionalen 
Unterschied. Aber frage ich mich warum es in dem Skript dann gemischt 
verwendet wird. Gibt es zwischen diesen Notationen einen Unterschied?

von Jörg G. (joergderxte)


Lesenswert?

Da gibt's anscheinend keinen Unterschied: 
http://www.gnu.org/software/make/manual/make.html#Reference

von hp-freund (Gast)


Lesenswert?

http://www.gnu.org/software/make/manual/make.html

Such mal auf der Seite nach: $( und ${ . Ich denke es ist das Gleiche 
und dient der besseren Übersicht bei Verschachtelung von Variablen und 
Funktionen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Yalu X. (yalu) (Moderator)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Yalu X. 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 ..."

von Yalu X. (yalu) (Moderator)


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)"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Yalu X. (yalu) (Moderator)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Meine Vermutung wäre allerdings eine andere: Variablen in der Shell
werden auch mit ${...} geklammert ($(...) bedeutet dort was anderes,
und dies ist außerdem eine sehr neuzeitliche [ca. 1993] Erfindung),
und man wollte irgendwie wenig "visuelle Umgewöhnung" ermöglichen.

von Yalu X. (yalu) (Moderator)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.