Wanneer gebruik je een beugeluitbreiding?

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

  • Dit kan ook worden gebruikt voor het dupliceren van argumenten. Stel dat je een programma hebt waarvoor een ‘ -f ‘ argument voor elk bestand om mee te werken. in plaats van program -f file1 -f file2 -f file3 te doen, kun je program "-f file"{1..3}
  • Dit is jammer. Ik heb het net ontdekt, maar doe jarenlang de back-up op extra lange paden zonder het rhis te kennen. Bedankt.
  • @Patrick: dat mislukt omdat program drie woorden krijgt: "-f file1" "-f file2" "-f file3", in plaats van 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Expansie gebruiken voor gebruik in een for -lus is een beetje zinloos, aangezien je for ((i=1; i<=100; i++)) en het is efficiënter.

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 en subdir2 in niet-letterlijke zin. Vervang subdir1 door cat en subdir2 door dog 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 naar file1 file2, terwijl file[12] alleen wordt uitgebreid naar bestaande bestandsnamen: dwz if file1 bestaat maar file2 niet ‘ t, file[12] wordt alleen uitgebreid tot file1. 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.acpart.kb

Je kunt die stukken weer samenvoegen door accolade-uitbreidingen , zoals deze

cat part.{{a..j}{a..z},k{a..b}} > hugeFile.zip 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *