Brace Expansion in Linux ist eine leistungsstarke Shell-Funktion, die es ermöglicht, in der Kommandozeile mehrere Strings in einer kompakten Form zu erzeugen. Diese Technik wird hauptsächlich in der bash-Shell verwendet, aber auch andere Shells wie zsh unterstützen sie.
Syntax
Die grundlegende Syntax für Brace Expansion sieht wie folgt aus.
{string1,string2,...}Die Klammern {} enthalten eine durch Komma getrennte Liste von Strings. Wenn die Shell auf eine solche Konstruktion stößt, wird sie in jede mögliche Kombination der angegebenen Strings expandiert.
Beispiele
Einfachste Form der Brace Expansion
echo {a,b,c}Dies erzeugt die Ausgabe a b c. Die Shell expandiert die Eingabe {a,b,c} zu a, b und c.
Brace Expansion mit Dateipfaden
touch file{1,2,3}.txt
ls file*.txtDas Kommando touch{1,2,3}.txt erzeugt drei Dateien: file1.txt, file2.txt und file3.txt. Die Brace Expansion sorgt dafür, dass die Shell die Eingabe file{1,2,3}.txt zu file1.txt, file2.txt und file3.txt expandiert, die dann von touch erstellt werden.
Range Expansion - Zahlen
echo {1..5}Dies erzeugt die Ausgabe "1 2 3 4 5". Der Ausdruck wird zu allen Zahlen expandiert.
Range Expansion - Buchstaben
echo {a..e}Dies erzeugt die Ausgabe "a b c d e". Der Ausdruck wird zu allen Buchstaben von a bis e expandiert.
Range Expansion - Zahlen mit Schritten
echo {0..10..2}Diese Anweisung erzeugt die Ausgabe "0 2 4 6 8 10". Der Ausdruck wird zu den Zahlen von 0 bis 10 expandiert, wobei der Schritt zwischen den Zahlen 2 beträgt.
Kombination mit Variablen
prefix="file"
touch ${prefix}{1,2,3}.txtIn dieser Anweisung wird die Variable prefix mit Brace Expansion kombiniert. Die Shell ersetzt ${prefix} durch den Wert file, sodass file{1,2,3}.txt zu file1.txt, file2.txt und file3.txt expandiert wird.
Brace Expansion und Ordner
mkdir -p dir/{subOne,subTwo,subThree}Diese Anweisung erstellt im aktuellen Ordner einen Ordner dir, in welchem dann der Reihe nach die Ordner subOne, subTwo und subThree erstellt werden.
Wenn man sich direkt nach dieser Anweisung die Ordner rekursiv anzeigt, sieht die Struktur folgendermaßen aus.
ls dir/*dir/subOne:
dir/subTwo:
dir/subThree:Häufige Stolperfallen
Brace Expansion findet vor Glob und Variablen-Expansion statt
Die Reihenfolge in Bash lautet: erst Brace Expansion, dann Tilde, dann Variablen, dann Wort-Splitting, dann Globbing. echo {a,b} wird zu a b — bevor irgendwas anderes passiert. Das bedeutet: {a,b}.txt wird nicht durch das Dateisystem geprüft (anders als *.txt), sondern blind erzeugt. Auch wenn keine a.txt existiert, kommt a.txt heraus.
`$var` in Klammern wird nicht expandiert
liste="a,b,c"; echo {$liste} liefert wörtlich {a,b,c}, nicht a b c. Brace Expansion liest die Liste vor jeder Variablen-Auflösung — der Inhalt der Variable kommt zu spät. Wer dynamische Listen will, braucht eval (mit allen Sicherheitsrisiken) oder ein Array: arr=(a b c); echo "${arr[@]}".
Anführungszeichen deaktivieren Brace Expansion
echo "{a,b,c}" druckt {a,b,c} als Literal. In Single Quotes sowieso. Wenn du Brace Expansion brauchst, dürfen die Klammern nicht zitiert sein — Variablen daneben aber sehr wohl: cp datei.txt{,.bak} legt datei.txt.bak an, mit Quotes um datei.txt (für Pfade mit Leerzeichen) wird's: cp "datei mit raum.txt"{,.bak}.
POSIX-`sh` und `dash` kennen keine Brace Expansion
Skripte mit #!/bin/sh (verlinkt auf dash unter Debian/Ubuntu) verarbeiten {a,b} nicht als Expansion, sondern als Literal. Wer Brace Expansion braucht, muss explizit #!/bin/bash oder #!/usr/bin/env bash setzen. ShellCheck warnt, wenn Bash-Features in einem sh-Skript stehen.
Range mit Schritten und führenden Nullen
{01..10} erzeugt zweistellige Zahlen mit führender Null (01 02 ... 10) — extrem nützlich für Dateinamen, die alphabetisch sortierbar bleiben sollen. Aber: {1..010} kann je nach Bash-Version unterschiedlich interpretiert werden, und Variablen wie {1..$ende} funktionieren in Bash nicht (Brace zuerst). Für variable Bereiche seq oder for ((i=1; i<=ende; i++)) benutzen.
Weiterführende Ressourcen
Externe Quellen
- Bash Reference Manual: Brace Expansion — formale Definition und Reihenfolge
- bash(1) – Linux manual page — Abschnitt „EXPANSION“
- Arch Wiki: Bash — praxisnahe Beispiele