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?
Da gibt's anscheinend keinen Unterschied: http://www.gnu.org/software/make/manual/make.html#Reference
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.
$(...) 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.
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.
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 ..."
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)" |
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.