Ik begrijp wat brace-uitbreiding is, maar ik weet niet hoe ik dit het beste kan gebruik het.
Wanneer gebruik je het?
Leer me alsjeblieft enkele handige en opmerkelijke voorbeelden als je je eigen tip hebt.
Antwoord
Brace-uitbreiding is erg handig als je lange padnamen hebt. Ik gebruik het als een snelle manier om een back-up te maken van een bestand :
cp /a/really/long/path/to/some/file.txt{,.bak}
kopieert /a/really/long/path/to/some/file.txt
naar /a/really/long/path/to/some/file.txt.bak
Je kunt het ook gebruiken in een reeks . Ik heb dit ooit gedaan om download veel paginas van internet:
wget http://domain.com/book/page{1..5}.html
of
for i in {1..100} do #do something 100 times done
Reacties
Antwoord
Brace-uitbreiding is erg handig bij het maken van grote mapstructuren:
mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}
Dit geeft je
find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2
Je zou zelfs een stap verder kunnen gaan en brace-uitbreiding in brace-uitbreiding plaatsen:
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
Dit geeft je dezelfde directorystructuur als in het bovenstaande voorbeeld.
Reacties
- Nesten is leuk, maar je nestvoorbeeld (
mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}
) doet niet ‘ dient eigenlijk geen enkel doel. Je had dit zojuist kunnen doen:mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
. - @iconoclast, het dient een doel als je
subdir1
interpreteert ensubdir2
in niet-letterlijke zin. Vervangsubdir1
doorcat
ensubdir2
doordog
bijvoorbeeld. - @ephsmith: als je ” subdir1 ” interpreteert als vervangend voor ” cat ” en ” subdir2 ” voor ” dog “, dan mislukt het nestvoorbeeld, omdat het subdir {1,2} gebruikt en er is geen tekenreeks die u kunt vervangen ” subdir ” waarmee subdir {1,2} retourneert {kat, hond}.
Antwoord
Ik gebruik het als ik het typen wil verminderen:
geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2}
Nog een voorbeeld:
wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev
Antwoord
Ik gebruik het om werkelijke test output naar gewenste test output tijdens ontwikkeling. Als test # 41 mislukt, is het gemakkelijk te zien wat het verschil is tussen de testuitvoer (in het bestand tests.output / 041) en de gewenste uitvoer (in het bestand tests.out / 041):
$ diff tests.{out,output}/041
Antwoord
Enkele veelvoorkomende gevallen voor mij zijn:
Voor het hernoemen:
mv myText.{txt,tex}
of
mv myText.tex{,.old}
of
cp myText.tex{,.backup}
(Hoewel het minder rommelig is om versiebeheer te gebruiken voor de laatste 2 taken.)
Voor het vergelijken (al genoemd):
diff path{1,2}/a.txt
Antwoord
Er zijn hier verschillende goede antwoorden, maar geen van hen vermeldt wanneer niet om accolades te gebruiken. Net als de andere antwoordapparaten, gebruik ik nogal wat accolade-uitbreiding op de opdrachtregel. Ik gebruik het ook in mijn aliassen en functies, aangezien ik een slimme shell kan verwachten.
Ik gebruik het niet in mijn shellscripts (tenzij er een andere reden is waarom de scripts zou bash of zsh moeten zijn, maar in die gevallen is het het beste om te upgraden naar een “echte” scripttaal zoals perl
of python
). Brace-uitbreiding is niet draagbaar omdat het niet in de POSIX shell-standaard. Zelfs als het werkt in uw /bin/sh
– shebang ed shell-scripts, zal het niet werken op systemen met meer gestripte /bin/sh
shells (bijv. dash
).
In het geval van een verschil van een enkel cijfer, heb je geen accolade-uitbreiding nodig; een karakterklasse is voldoende:
Basjisme:
diff file{1,2}
Draagbaar:
diff file[12]
Reacties
- Een verschil is dat
file{1,2}
zal altijd worden uitgebreid naarfile1 file2
, terwijlfile[12]
alleen wordt uitgebreid naar bestaande bestandsnamen: dwz iffile1
bestaat maarfile2
niet ‘ t,file[12]
wordt alleen uitgebreid totfile1
. De[]
-uitbreiding is eigenlijk een beperkte versie van?
expansie (en ze heten ” padnaamuitbreidingen “). - Correct, accolade-uitbreiding is niet shell globbing (ook bekend als padnaamuitbreiding). Dat ‘ is een goede call-out die geen
t is al genoemd: brace-uitbreiding is beter in het opmerken van onverwacht afwezige paden. U kunt ook binnen accolade-uitbreiding globaliseren.
Antwoord
Na het splitsen van een heel groot bestand met
split -b 100m hugeFile.zip part.
stel dat het is opgesplitst in 262 stukken, met andere woorden part.aa
, part.ab
, part.ac
… part.kb
Je kunt die stukken weer samenvoegen door accolade-uitbreidingen , zoals deze
cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip
program -f file1 -f file2 -f file3
te doen, kun jeprogram "-f file"{1..3}
program
drie woorden krijgt:"-f file1" "-f file2" "-f file3"
, in plaats van 6:"-f" "file1" "-f" "file2" "-f" "file3"
.for
-lus is een beetje zinloos, aangezien jefor ((i=1; i<=100; i++))
en het is efficiënter.