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


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}"?


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.