Jeg forstår hvad bøjleudvidelse er, men jeg ved ikke, hvordan man bedst kan brug det.
Hvornår bruger du det?
Lær mig nogle praktiske og bemærkelsesværdige eksempler, hvis du har dit eget tip.
Svar
Brace-udvidelse er meget nyttig, hvis du har lange stienavne. Jeg bruger det som en hurtig måde at sikkerhedskopiere en fil :
cp /a/really/long/path/to/some/file.txt{,.bak}
kopierer /a/really/long/path/to/some/file.txt
til /a/really/long/path/to/some/file.txt.bak
Du kan også bruge den i en sekvens . Jeg gjorde det engang for at download mange sider fra internettet:
wget http://domain.com/book/page{1..5}.html
eller
for i in {1..100} do #do something 100 times done
Kommentarer
Svar
Brace-udvidelse kommer meget praktisk, når du opretter store katalogstrukturer:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Dette giver dig
find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2
Du kan endda gå et skridt videre og sætte brace-ekspansion i brace-ekspansion:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Dette giver dig den samme katalogstruktur som eksemplet ovenfor.
Kommentarer
- Indlejring er rart, men dit indlejringseksempel (
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) betyder ikke ‘ tjener faktisk ikke noget formål. Du kunne bare have gjort dette:mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
. - @iconoclast, det tjener et formål, hvis du fortolker
subdir1
ogsubdir2
i ikke-bogstavelig forstand. Udskiftsubdir1
medcat
ogsubdir2
meddog
for eksempel. - @ephsmith: hvis du fortolker ” subdir1 ” som stående til ” kat ” og ” underdir2 ” til ” hund “, så mislykkes nestningseksemplet, da det bruger subdir {1,2}, og der er ingen streng, du kan erstatte ” undermappe ” med det, der får undermappe {1,2} til at returnere {kat, hund}.
Svar
Jeg bruger det, når jeg vil reducere indtastningen:
geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2}
Et andet eksempel:
wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev
Svar
Jeg bruger det til at sammenligne faktisk test output til ønsket test output under udvikling. Hvis test nr. 41 mislykkes, er det let at se, hvilken forskel der er mellem testoutputtet (i filtests.output / 041) og det ønskede output (i filtests.out / 041):
$ diff tests.{out,output}/041
Svar
Nogle hyppige tilfælde for mig er:
Til omdøbning:
mv myText.{txt,tex}
eller
mv myText.tex{,.old}
eller
cp myText.tex{,.backup}
(Selvom det er mindre rodet at bruge versionskontrol til de sidste to opgaver.)
Til sammenligning (allerede nævnt):
diff path{1,2}/a.txt
Svar
Der er flere gode svar her, men ingen af dem nævner når ikke for at bruge bøjleudvidelse. Ligesom de andre svarere bruger jeg brace-udvidelse på kommandolinjen en hel del. Jeg bruger det også i mine aliaser og funktioner, da jeg kan forvente en smart shell.
Jeg bruger ikke den i mine shell-scripts (medmindre der er en anden grund til scripts skal være bash eller zsh, men i disse tilfælde er det bedst at opgradere til et “rigtigt” script-sprog som perl
eller python
). Brace-udvidelse er ikke bærbar da den ikke er i POSIX-skalstandarden. Selvom det fungerer i dine /bin/sh
– shebang ed shell-scripts, fungerer det ikke på systemer med mere strippet /bin/sh
skaller (f.eks. dash
).
I tilfælde af en forskel på et enkelt ciffer behøver du ikke udvidelse af afstivning; en karakterklasse er tilstrækkelig:
Bashisme:
diff file{1,2}
Bærbar:
diff file[12]
Kommentarer
- En forskel er at
file{1,2}
altid udvides tilfile1 file2
, mensfile[12]
kun udvides til eksisterende filnavne: dvs. hvisfile1
findes, menfile2
ikke ‘ t,file[12]
udvides kun tilfile1
.[]
udvidelsen er virkelig en begrænset version af?
udvidelse (og de kaldes ” udvidelser af stienavn “). - Korrekt, bøjleudvidelse er ikke shell globbing (aka pathname expansion). ‘ er en god call-out, der ikke har
t er virkelig blevet nævnt endnu: bøjleudvidelse er bedre til at bemærke uventet fraværende stier. Du kan også globere indvendigt udvidelse af bøjlen.
Svar
Efter at have delt en meget stor fil med
split -b 100m hugeFile.zip part.
lad os antage, at den blev delt i 262 stykker, med andre ord part.aa
, part.ab
, part.ac
… part.kb
Du kan slutte dig til disse stykker igen ved at indlejre bøjleudvidelser som denne
cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip
program -f file1 -f file2 -f file3
, kan du gøreprogram "-f file"{1..3}
program
får tre ord:"-f file1" "-f file2" "-f file3"
i stedet for 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
-sløjfe er lidt meningsløs, da du kan skrivefor ((i=1; i<=100; i++))
og det er mere effektivt.