Warum in Bash {{a, b}. {C, d}} erweitert sich auf {ac} {ad} {bc} {bd}

7

In Bash wird echo {{a,b}.{c,d}} erweitert auf {a.c} {a.d} {b.c} {b.d} Obwohl im Bash-Handbuch für die Art der Eingabe, die ich vorgenommen habe, nichts für die Klammererweiterung erwähnt wird

Meine Frage ist, warum die Ausgabe nicht wie diese ac ad bc bd ist

Neo_Returns
quelle
2
... Weil es außen Zahnspangen gibt ...
Ignacio Vazquez-Abrams

Antworten:

11

In bashder Erweiterung der {word}ist , {word}wenn das Wort einen Bereich nicht enthält ( ..) oder ein Komma.

In Ihrem Fall enthält wordzufällig zwei Klammererweiterungen. Diese werden von links nach rechts erweitert, sodass Sie zuerst {a.{c,d}} {b.{c,d}}und dann {a.c} {a.d} {b.c} {b.d}das Endergebnis erhalten.

Beachten Sie, dass die äußeren Klammern nicht erweitert werden, da sie keinen Bereich oder ein Komma enthalten. Sie würden ein ähnliches Ergebnis mit erhalten @{a,b}.{c,d}@.

Wenn Sie es versucht {{a,b},{c,d}}hätten, hätten Sie drei Erweiterungen (die Erweiterung erfolgt in drei Schritten, wobei jeweils ein Satz Klammern erweitert wird). Zuerst der äußere in {a,b} {c,d}und dann der linke in a b {c,d}und schließlich a b c ddas Endergebnis.

Siehe auch: Warum gibt "cat {foo}" nicht foo aus, sondern "cat {foo, bar}"?

Kusalananda
quelle
Dank ist mir jetzt klar, dass Klammern nur erweitert werden, wenn zwischen ihnen durch Koma getrennte Zeichenfolgen oder Bereiche angegeben sind. Für den Ausdruck {{a, b}, {c, d}} wird die Ausgabe jedoch nur in bash abcd, da alle geschweiften Klammern erweitert werden. Dies kann auch durch Hinzufügen einer Präambel und eines Postfixes bewiesen werden, zum Beispiel {c {a, o} t, d {o, a} g}
Neo_Returns
@Neo_Returns Ich war verwirrt von Ihrem Kommentar und Ihrem Bearbeitungsvorschlag, dann wurde mir klar, dass ich "drei Erweiterungen" sagte. Ich habe das jetzt geklärt, hoffe ich.
Kusalananda