Kiedy używasz rozszerzenia nawiasów klamrowych?


Odpowiedzi:


52

Rozwijanie nawiasów jest bardzo przydatne, jeśli masz długie nazwy ścieżek. Używam go jako szybkiego sposobu na wykonanie kopii zapasowej pliku :

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

skopiuje /a/really/long/path/to/some/file.txtdo/a/really/long/path/to/some/file.txt.bak

Możesz także użyć go w sekwencji . Kiedyś tak zrobiłem, aby pobrać wiele stron z Internetu:

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

lub

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

8
Można to również wykorzystać do powielania argumentów. Załóżmy, że masz jakiś program, który wymaga argumentu „-f” dla każdego pliku do działania. zamiast tego program -f file1 -f file2 -f file3możesz zrobićprogram "-f file"{1..3}
Patrick

To wstyd. Właśnie to odkryłem, ale od lat robię kopię zapasową na długich ścieżkach, nie znając rhis. Dzięki.
smonff

2
@Patrick: To nie działa, ponieważ programdostaje trzy słowa: "-f file1" "-f file2" "-f file3"zamiast 6: "-f" "file1" "-f" "file2" "-f" "file3".
musiphil

@dogbane: Używanie rozszerzenia do użycia w forpętli jest nieco bezcelowe, ponieważ możesz pisać for ((i=1; i<=100; i++))i jest bardziej wydajne.
musiphil

30

Rozszerzenie nawiasów klamrowych jest bardzo przydatne podczas tworzenia dużych struktur katalogów:

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

To ci da

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

Możesz nawet pójść o krok dalej i umieścić rozwinięcie nawiasu klamrowego w rozwinięciu nawiasu:

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

To da ci taką samą strukturę katalogów jak w powyższym przykładzie.


3
Zagnieżdżanie jest fajne, ale twój przykład zagnieżdżenia ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) tak naprawdę nie służy żadnemu celowi. Mogłeś po prostu zrobić to: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclast

@iconoclast, robi służyć jakiemuś celowi, jeśli interpretować subdir1i subdir2w nie dosłownym sensie. Wymień subdir1się cati subdir2ze dognp.
efmith

2
@ephsmith: jeśli interpretujesz „subdir1” jako „cat” i „subdir2” dla „dog”, wówczas przykład zagnieżdżenia kończy się niepowodzeniem, ponieważ używa subdir {1,2} i nie ma łańcucha, który można zastąpić „subdir” z tym spowoduje, że subdir {1,2} zwróci {kot, pies}.
iconoclast

21

Używam go, gdy chcę ograniczyć pisanie:

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

Inny przykład:

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

12

Używam go do porównywania rzeczywistych wyników testowych z pożądanymi wynikami testowymi podczas programowania. Jeśli test nr 41 nie powiedzie się, łatwo zobaczyć, jaka jest różnica między wyjściem testowym (w pliku tests.output / 041) a pożądanym wyjściem (w pliku tests.out / 041):

$ diff tests.{out,output}/041

10

Niektóre częste przypadki dla mnie to:

Do zmiany nazwy:

mv myText.{txt,tex}

lub

mv myText.tex{,.old}

lub

cp myText.tex{,.backup}

(Chociaż korzystanie z kontroli wersji dla ostatnich 2 zadań jest mniej skomplikowane).

Dla porównania (już wspomniane):

diff path{1,2}/a.txt

3

Jest tu kilka świetnych odpowiedzi, ale żadna z nich nie wspomina, kiedy nie używać rozszerzenia nawiasów klamrowych. Podobnie jak inni odpowiadający, dość często używam nawiasów klamrowych w linii poleceń. Używam go również w moich aliasach i funkcjach, ponieważ mogę oczekiwać inteligentnej powłoki.

Mam nie używać go w moich skryptów powłoki (chyba, że jest jakiś inny powód skrypty powinny być bash lub zsh, choć w tych przypadkach, najlepiej dokonać aktualizacji do „prawdziwego” języka skryptowego jak perllub python). Rozszerzenie nawiasów klamrowych nie jest przenośne, ponieważ nie znajduje się w standardzie powłoki POSIX. Nawet jeśli działa w swoim /bin/sh- shebang skryptów powłoki ed, to nie będzie działać w systemach z więcej pozbawionych /bin/shpowłoki (np dash).

W przypadku różnicy jednej cyfry nie potrzebujesz rozszerzenia nawiasu; wystarczy klasa postaci:

Bashism:

diff file{1,2}

Przenośny:

diff file[12]

3
Różnica polega na tym, file{1,2}że zawsze rozwija się do file1 file2, podczas gdy file[12]rozwija się tylko do istniejących nazw plików: tzn. Jeśli file1istnieje, ale file2nie istnieje , file[12]rozwija się file1tylko do . []Ekspansja jest naprawdę ograniczona wersja ?rozszerzenia (i są one nazywane „ekspansje pathname”).
musiphil

Prawidłowo, interpretacja nawiasów klamrowych nie jest globowaniem powłoki (inaczej rozwinięciem nazwy ścieżki). To dobre wezwanie, o którym tak naprawdę jeszcze nie wspomniano: rozszerzenie nawiasów klamrowych lepiej zauważa nieoczekiwanie nieobecne ścieżki. Możesz także globować wewnątrz nawiasów klamrowych.
Adam Katz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.