Rozumiem, czym jest rozszerzenie nawiasów klamrowych , ale nie wiem, jak najlepiej go używać.
Kiedy go używasz?
Naucz mnie kilku wygodnych i niezwykłych przykładów, jeśli masz własną wskazówkę.
Rozumiem, czym jest rozszerzenie nawiasów klamrowych , ale nie wiem, jak najlepiej go używać.
Kiedy go używasz?
Naucz mnie kilku wygodnych i niezwykłych przykładów, jeśli masz własną wskazówkę.
Odpowiedzi:
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.txt
do/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
program
dostaje trzy słowa: "-f file1" "-f file2" "-f file3"
zamiast 6: "-f" "file1" "-f" "file2" "-f" "file3"
.
for
pętli jest nieco bezcelowe, ponieważ możesz pisać for ((i=1; i<=100; i++))
i jest bardziej wydajne.
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.
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}
.
subdir1
i subdir2
w nie dosłownym sensie. Wymień subdir1
się cat
i subdir2
ze dog
np.
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
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
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 perl
lub 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/sh
powł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]
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 file1
istnieje, ale file2
nie istnieje , file[12]
rozwija się file1
tylko do . []
Ekspansja jest naprawdę ograniczona wersja ?
rozszerzenia (i są one nazywane „ekspansje pathname”).
program -f file1 -f file2 -f file3
możesz zrobićprogram "-f file"{1..3}