Când utilizați expansiunea bretelei?

Înțeleg ce este extinderea aparatului , dar nu știu cum să folosește-l.

Când îl folosești?
Te rog să-mi înveți câteva exemple convenabile și remarcabile dacă ai propriul tău sfat.

Răspunde

Extinderea paranteză este foarte utilă dacă aveți nume de căi lungi. Îl folosesc ca o modalitate rapidă de a copia de rezervă a unui fișier :

cp /a/really/long/path/to/some/file.txt{,.bak} 

va copia /a/really/long/path/to/some/file.txt în /a/really/long/path/to/some/file.txt.bak

De asemenea, îl puteți utiliza într-o secvență . Odată am făcut asta pentru a descărcați o mulțime de pagini de pe web:

wget http://domain.com/book/page{1..5}.html 

sau

for i in {1..100} do #do something 100 times done 

Comentarii

  • Acesta poate fi folosit și pentru duplicarea argumentelor. Spuneți că aveți un program care necesită un ‘ -f ‘ argument pentru fiecare fișier pentru a opera. în loc să faceți program -f file1 -f file2 -f file3, puteți face program "-f file"{1..3}
  • Este o rușine. Tocmai l-am descoperit, dar fac lucrurile de rezervă pe căi extra-lungi de ani de zile fără să știu Rhis. Mulțumim.
  • @Patrick: Eșuează deoarece program primește trei cuvinte: "-f file1" "-f file2" "-f file3", în loc de 6: "-f" "file1" "-f" "file2" "-f" "file3".
  • @dogbane: Utilizarea expansiunii pentru utilizare într-o buclă for este puțin inutilă, deoarece puteți scrie for ((i=1; i<=100; i++)) și este mai eficient.

Răspuns

Extindere este foarte util atunci când creați structuri mari de directoare:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2} 

Acest lucru vă va oferi

find dir1 -type d dir1 dir1/subdir1 dir1/subdir1/subsubdir1 dir1/subdir1/subsubdir2 dir1/subdir2 dir1/subdir2/subsubdir1 dir1/subdir2/subsubdir2 

Puteți chiar să faceți un pas mai departe și să puneți expansiunea bretelei în expansiunea bretelei:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}} 

Acest lucru vă va oferi aceeași structură de director ca exemplul de mai sus.

Comentarii

  • Cuibărirea este frumoasă, dar exemplul dvs. de cuibărire (mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) nu ‘ nu servesc de fapt niciunui scop. Ați fi putut face acest lucru: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
  • @iconoclast, are un scop dacă interpretați subdir1 și subdir2 în sens non-literal. Înlocuiți subdir1 cu cat și subdir2 cu dog de exemplu.
  • @ephsmith: dacă interpretați ” subdir1 ” ca reprezentând ” cat ” și ” subdir2 ” pentru ” dog „, atunci exemplul de cuibare eșuează, deoarece folosește subdir {1,2} și nu există niciun șir pe care să îl puteți înlocui ” subdir ” cu care va face subdir {1,2} return {pisică, câine}.

Răspuns

Îl folosesc când vreau să reduc textul:

geany /path/to/file1 /path/to/file2 # versus geany /path/to/file{1,2} 

Un alt exemplu:

wajig install libpam0g-dev libiw-dev libdb-dev # versus wajig install lib{pam0g,iw,db}-dev 

Răspuns

îl folosesc pentru a compara actualul ieșire de test la ieșirea de test dorită în timpul dezvoltării. Dacă testul # 41 eșuează, este ușor să vedeți care este diferența dintre ieșirea testului (în fișierul tests.output / 041) și ieșirea dorită (în fișierul tests.out / 041):

$ diff tests.{out,output}/041 

Răspuns

Unele cazuri frecvente pentru mine sunt:

Pentru redenumire:

mv myText.{txt,tex} 

sau

mv myText.tex{,.old} 

sau

cp myText.tex{,.backup} 

(Deși este mai puțin murdar să folosești controlul versiunilor pentru ultimele 2 activități.)

Pentru comparare (menționat deja):

diff path{1,2}/a.txt 

Răspuns

Există mai multe răspunsuri grozave aici, dar niciunul dintre ele nu menționează când nu pentru a utiliza expansiunea bretelei. La fel ca ceilalți respondenți, eu folosesc destul de mult expansiunea pe linia de comandă. De asemenea, îl folosesc în aliasurile și funcțiile mele, deoarece mă pot aștepta la un shell inteligent.

Nu îl folosesc în scripturile mele shell (cu excepția cazului în care există un alt motiv pentru scripturi ar trebui să fie bash sau zsh, deși în aceste cazuri, cel mai bine este să faceți upgrade la un limbaj de scriptare „real” precum perl sau python ). Extinderea parantezei nu este portabilă deoarece nu se află în standardul shell POSIX. Chiar dacă funcționează în /bin/sh shebang scripturi shell ed, nu va funcționa pe sisteme cu mai multe stripped /bin/sh cochilii (de ex. dash).

În cazul unei diferențe dintr-o singură cifră, nu aveți nevoie de extindere a parantezelor; o clasă de caractere va fi suficientă:

Bashism:

diff file{1,2} 

Portabil:

diff file[12] 

Comentarii

  • O diferență este că file{1,2} se va extinde întotdeauna la file1 file2, în timp ce file[12] se extinde numai la numele de fișiere existente: adică dacă file1 există, dar file2 nu ‘ t, file[12] se extinde la numai file1. Extinderea [] este într-adevăr o versiune restricționată a ? expansiune (și se numesc ” expansiuni de cale „).
  • Corect, expansiunea bretelei nu este shell globbing (cunoscut și ca extensie de cale). Aceasta ‘ este un bun apel care nu are

    nu a fost încă menționat: extinderea bretelei este mai bună pentru a observa căile absente neașteptat Puteți, de asemenea, să intrați în interiorul expansiunii acoladei.

Răspuns

După împărțirea unui fișier foarte mare cu

split -b 100m hugeFile.zip part. 

să presupunem că s-a împărțit în 262 bucăți, cu alte cuvinte part.aa, part.ab, part.acpart.kb

Vă puteți alătura din nou acelor piese cuibărind expansiuni de bretele , astfel

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *