Wann verwenden Sie die Klammererweiterung?


49

Ich verstehe, was Klammererweiterung ist, aber ich weiß nicht, wie ich sie am besten verwenden soll.

Wann benutzt du es
Bitte bringen Sie mir einige praktische und bemerkenswerte Beispiele bei, wenn Sie Ihren eigenen Tipp haben.

Antworten:


52

Die Klammererweiterung ist sehr nützlich, wenn Sie lange Pfadnamen haben. Ich benutze es als eine schnelle Möglichkeit, eine Datei zu sichern :

cp /a/really/long/path/to/some/file.txt{,.bak}

kopiert /a/really/long/path/to/some/file.txtnach/a/really/long/path/to/some/file.txt.bak

Sie können es auch in einer Sequenz verwenden . Ich habe dies einmal getan, um viele Seiten aus dem Internet herunterzuladen:

wget http://domain.com/book/page{1..5}.html

oder

for i in {1..100}
do
   #do something 100 times
done

8
Dies kann auch für die Duplizierung von Argumenten verwendet werden. Angenommen, Sie haben ein Programm, für das für jede Datei ein '-f'-Argument erforderlich ist. Anstatt zu tun program -f file1 -f file2 -f file3, können Sieprogram "-f file"{1..3}
Patrick

Das ist eine Schande. Ich habe es gerade entdeckt, aber mache das Backup jahrelang auf extra langen Pfaden, ohne Rhis zu kennen. Vielen Dank.
Smonff

2
@Patrick: Das schlägt fehl , da programbekommt drei Worten: "-f file1" "-f file2" "-f file3"statt 6: "-f" "file1" "-f" "file2" "-f" "file3".
Musiphil

@dogbane: Die Verwendung der Erweiterung für die Verwendung in einer forSchleife ist etwas sinnlos, da Sie schreiben können for ((i=1; i<=100; i++))und sie effizienter ist.
musiphil

30

Die Erweiterung von Klammern ist sehr praktisch, wenn Sie große Verzeichnisstrukturen erstellen:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

Dies wird dir geben

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

Sie können sogar noch einen Schritt weiter gehen und die Klammererweiterung in die Klammererweiterung einfügen:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

Dadurch erhalten Sie die gleiche Verzeichnisstruktur wie im obigen Beispiel.


3
Schachteln ist nett, aber Ihr Beispiel für Schachteln ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) erfüllt eigentlich keinen Zweck. Sie könnten nur das getan: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
Iconoclast

@iconoclast, es hat einen Zweck, wenn Sie interpretieren subdir1und subdir2im nicht-wörtlichen Sinne. Ersetzen Sie subdir1mit catund subdir2mit dogzum Beispiel.
Ephsmith

2
@ephsmith: Wenn Sie "subdir1" so interpretieren, dass es für "cat" und "subdir2" für "dog" steht, schlägt das Verschachtelungsbeispiel fehl, da es das Unterverzeichnis {1,2} verwendet und es keine Zeichenfolge gibt, die Sie ersetzen können "subdir" bewirkt, dass subdir {1,2} {cat, dog} zurückgibt.
Iconoclast

21

Ich benutze es, wenn ich das Tippen reduzieren möchte:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

Ein anderes Beispiel:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

Ich verwende es, um die tatsächliche Testleistung mit der gewünschten Testleistung während der Entwicklung zu vergleichen. Wenn Test Nr. 41 fehlschlägt, können Sie leicht den Unterschied zwischen der Testausgabe (in der Datei tests.output / 041) und der gewünschten Ausgabe (in der Datei tests.out / 041) erkennen:

$ diff tests.{out,output}/041

10

Einige häufige Fälle für mich sind:

Zum Umbenennen:

mv myText.{txt,tex}

oder

mv myText.tex{,.old}

oder

cp myText.tex{,.backup}

(Obwohl es weniger umständlich ist, die Versionskontrolle für die letzten beiden Aufgaben zu verwenden.)

Zum Vergleichen (bereits erwähnt):

diff path{1,2}/a.txt

3

Hier gibt es mehrere gute Antworten, von denen jedoch keine erwähnt, wann keine Klammererweiterung verwendet werden soll. Wie die anderen Antwortenden verwende ich die geschweifte Klammer in der Befehlszeile ziemlich oft. Ich benutze es auch in meinen Aliasen und Funktionen, da ich eine intelligente Shell erwarten kann.

Ich nicht verwenden es in meinem Shell - Skripten (es sei denn , ein anderer Grund, sollten die Skripte bash oder zsh sein, obwohl in diesen Fällen ist es am besten zu einem „echten“ Skriptsprache zu aktualisieren wie perloder python). Die Klammererweiterung ist nicht portabel, da sie nicht im POSIX-Shell-Standard enthalten ist. Auch wenn es in Ihrem Werk /bin/sh- shebang ed Shell - Skripten, wird es nicht mehr ausgezogen auf Systemen /bin/shSchalen (zB dash).

Bei einem Unterschied von einer einzelnen Ziffer benötigen Sie keine Klammererweiterung. Eine Zeichenklasse wird ausreichen:

Baschismus:

diff file{1,2}

Tragbar:

diff file[12]

3
Ein Unterschied ist, dass file{1,2}immer auf erweitert wird file1 file2, während file[12]nur vorhandene Dateinamen erweitert werden: dh, wenn file1vorhanden, file2aber nicht, wird nur auf file[12]erweitert file1. Die []Erweiterung ist wirklich eine eingeschränkte Version der ?Erweiterung (und sie werden "Pfadnamenerweiterungen" genannt).
musiphil

Richtig, Klammererweiterung ist kein Shell-Globbing (auch bekannt als Pfadnamenerweiterung). Das ist ein guter Aufruf, der noch nicht wirklich erwähnt wurde: Klammererweiterung ist besser darin, unerwartet abwesende Pfade zu bemerken. Sie können auch die innere Klammer erweitern.
Adam Katz
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.