Hvornår bruger du bøjleudvidelse?

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

  • Dette kan også bruges til argument duplikering. Sig, at du har et program, der kræver et ‘ -f ‘ argument for hver fil, der skal betjenes. i stedet for at gøre program -f file1 -f file2 -f file3, kan du gøre program "-f file"{1..3}
  • Dette er en skam. Jeg har lige opdaget det, men gør backup ting på ekstra lange stier i årevis uden at kende rhis. Tak.
  • @Patrick: Det mislykkes, fordi program får tre ord: "-f file1" "-f file2" "-f file3" i stedet for 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Brug af udvidelse til brug i en for -sløjfe er lidt meningsløs, da du kan skrive for ((i=1; i<=100; i++)) og det er mere effektivt.

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 og subdir2 i ikke-bogstavelig forstand. Udskift subdir1 med cat og subdir2 med dog 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 til file1 file2, mens file[12] kun udvides til eksisterende filnavne: dvs. hvis file1 findes, men file2 ikke ‘ t, file[12] udvides kun til file1. [] 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.acpart.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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *