Care este diferența dintre bash, zsh, tcsh, sh etc.? Pe care ar trebui să îl folosesc?

Cel mai bun răspuns

Acestea sunt toate scoici și există multe altele pe care nu le-ați menționat. Pe care alegeți să îl utilizați este o chestiune de preferință personală.

Primul shell a fost Shell Bourne (sau sh) și a fost implicit pe Unix pentru o lungă perioadă de timp. Apoi a apărut o derivare majoră în Unix și a fost creată de la zero un nou shell numit C Shell (sau csh). Îmbătrânirea Bourne Shell a fost apoi urmată de Korn Shell compatibil, dar mult mai puternic (sau ksh). Shells-urile disponibile se încadrează în general în una dintre aceste categorii: derivat Bourne / Korn Shell (bash), derivat Shell C sau clonă (tcsh) sau „altele” (cum ar fi zsh).

Există multe shell-uri pentru alege dintre ele și nu doar pe cele pe care le-ai menționat. GNU bash se încadrează în tabăra Bourne / Korn Shell și este astăzi shell-ul implicit pentru o mare varietate de variante Unix și Linux. Dacă ați folosit un terminal shell pe Unix sau Linux, este probabil ca acesta să fie acesta. Dacă doriți cu adevărat și cu adevărat Bourne Shell (sh), cred că acum este disponibil gratuit – dar, în general, este evitat că nu are suficiente caracteristici. Korn Shell este compatibil cu versiunile anterioare și este, de asemenea, gratuit sub formă de clone (mksh) și originalul recent lansat (ksh).

Pentru C Shell, există tcsh, o clonă extinsă a originalului csh Există mai puține clone csh deoarece csh nu a fost văzut ca o cale de urmat și nu are la fel de mulți utilizatori – cu toate acestea, multe versiuni BSD ale Unix (cum ar fi FreeBSD și altele) vor folosi csh ca shell implicit.

Există variante care nu sunt nici compatibile cu sh / ksh sau csh – dar tind să fie nișe de nișă. Preferatele mele în acest spațiu ar fi Scheme Shell (scsh) și Plan 9 shell rc – dar acestea nu sunt niciodată instalate în mod implicit pe Unix sau Linux și primul este destul de mare. zsh se încadrează și în această „altă” categorie.

Recomandarea mea este de trei ori: mai întâi, încercați shell-ul implicit pe sistemul dvs. – aproape sigur GNU bash. Bash este peste tot și va citi și executa programe Bourne Shell și Korn Shell fără incompatibilități. În al doilea rând, încercați fiecare dintre cochiliile pe care doriți cu adevărat să le încercați (cum ar fi zsh sau tcsh) și lucrați cu el pentru o vreme și vedeți dacă vă satisface nevoile. În cele din urmă, utilizați oricine se potrivește fanteziei dvs.

Rețineți că nu trebuie să scrieți scripturi în shell-ul pe care îl utilizați: Am folosit C Shell în mod interactiv, dar am refuzat să programez în el (toate scripturile mele foloseau Korn Shell). În cele din urmă, într-o zi am făcut pasul în ksh și nu m-am uitat niciodată înapoi.

Favoritele mele personale la acest lucru punctele sunt mksh (o clonă Korn Shell fără extensii) – sau GNU bash cu compatibilitate completă Korn Shell – sau rc , shell-ul din noul sistem de operare Plan 9 care trebuia să fie un succesor Unix (deși acest lucru nu s-a concretizat).

Răspuns

Mai bine pentru ce?

Care sunt criteriile dvs.?

Personal sugerez bash deoarece este implicit pe sistemele Linux și MacOS X și disponibil imediat pe toate celelalte forme de Unix și sub MS Windows prin Cygwin și este implicit pentru Servicii Microsoft ™ Windows pentru Linux ” (Ubuntu bash strat / subsistem de asistență).

Practic este calea celei mai puțin rezistente dacă veți opera multe sisteme diferite de-a lungul mai multor ani … și veți accesa frecvent sisteme proaspăt reimaginate sau instanțe proaspete lansate cu abateri minime de la baza sistemului de operare (ca este obișnuit pentru fermele de server web / aplicație scalate). Este destul de aproape de Korn shell încât puțini oameni vor găsi cazurile de colț în care diferă din punct de vedere semantic. (Majoritatea utilizatorilor nu vor observa diferența dintre clonele Bourne mai mici, cum ar fi ash și dash și caracteristicile pe care le adaugă bash , cu atât mai puțin să poată distinge diferențele dintre ksh și bash .

zsh este probabil cel mai puternic și personalizabil. Este cel mai potrivit pentru cineva care este cu adevărat pasionat de utilizarea și personalizarea shell-ului său. Dezavantajul utilizării acestuia … cu toate îmbunătățirile și personalizările sale … este că utilizatorul va găsi probabil frustrant să renunțe la utilizarea altor shell-uri atunci când probleme de depanare pe sisteme în care zsh nu a fost (încă) instalat – ceea ce oamenii de ops / sysadmins din mediile moderne fac destul de frecvent.Este, de asemenea, destul de neobișnuit atunci când lucrați cu colegi sau îndrumați colegii și încercați să le arătați ceva la promptul shell sau partajați un ecran GNU sau tmux sesiune cu ei.

Shell-ul Korn, ksh , este un shell mai bun pentru scripting decât bash în câteva detalii minore … dar nu suficient pentru a merita să fie preluat, instalat și configurat peste tot.

ksh a acceptat „matrici asociative” (hash / dicționare) timp de mulți ani înainte ca bash să o adauge. (A fost adăugat doar la bash acum câțiva ani, încă nu este inclus în versiunile livrate cu MacOS X în mod implicit, de exemplu). Așadar, este de obicei cel mai bine să nu folosiți pur și simplu matrici asociative în scripturile shell. Dacă credeți că doriți caracteristicile sale, de obicei, cel mai bine este să treceți la Python, Ruby, Perl, TCL / wish sau la oricare dintre alte limbi de scriptare cu scop general . Pur și simplu nu se câștigă atât de mult prin trecerea la un shell diferit (în ceea ce privește cheltuielile operaționale) doar pentru acea caracteristică.

La fel se poate spune despre ksh Coprocese .

Singura altă diferență notabilă este una care trebuie explicată. Luați în considerare următoarea comandă shell:

unset foo; echo bar | read foo; echo "$foo"

Acest lucru este perfect valabil în orice shell compatibil Bourne. Dar se va comporta diferit sub diferite scoici. Fie va emite șirul „bar” (și o nouă linie), fie va emite doar linia goală.

bash va face acesta din urmă, în timp ce ksh și zsh vor funcționa în maniera anterioară. Variabila shell „foo” va fi setată în shell-ul curent. După părerea mea, aceasta este semantica preferată.

Dar acesta este un caz de colț. Din câte știu, nu este acoperit de specificațiile Posix pentru shell-ul Unix; deci faptul că comportamentul este dependent de implementare nu este o eroare. Acest lucru este doar un lucru pe care un expert în shell trebuie să îl cunoască și să îl testeze sau să îl rezolve.

Motivul acestui comportament este că operatorul „pipe” din shell este o comunicare între procese. mecanism. Shell-ul trebuie să creeze un subshell, adică un subproces care rulează propria copie a memoriei procesului părinte. Cu toate acestea, orice implementare dată poate analiza comanda și rula fie partea dinaintea (în stânga) simbolului conductei din subshell (așa cum se face prin ksh și zsh ) sau după (în dreapta) țevii (așa cum a făcut bash, foarte versiuni vechi ale ksh (înainte de lansarea din 1983?) și cele mai vechi shell Bourne și majoritatea dintre clonele sale precum ash și dash .

O lucrare în jur este să folosiți gruparea comenzilor pentru a vă asigura că toate comenzile după țeavă sunt „în sfera” cu citit încorporat astfel:

unset foo; echo bar | { read foo; echo "$foo"; }

(De altfel, acest exemplu expune o eroare subtilă care a existat în bash înainte de 1.4 și care a fost remediat după aceea; parserul a folosit pentru a trata {} personaje și jetoane ve seamănă foarte mult cu () (paranteze). Așadar, obișnuia să tolereze lăsarea în afara acelui punct și virgulă după ecoul meu „$ foo” – care a fost, din punct de vedere tehnic, o abatere de la spec. Problema este că milioane de oameni foloseau bash și scriau scripturi bazate pe presupunerea că nu aveau nevoie să-și încheie comanda înainte de o paranteză de închidere – cu un punct și virgulă sau o linie nouă. Deci, unele dintre aceste scripturi vechi de shell încă prezintă această eroare cu bine peste un deceniu mai târziu și există doar o mână de oameni care cunosc shell-ul suficient de bine pentru a-l detecta și remedia).

În ceea ce privește utilizarea interactivă, bash este în mod clar superior ksh , dar probabil nu este la fel de egal cu zsh pentru oricine s-ar angaja să învețe și să utilizeze îmbunătățiri și personalizări profund dificile.

bash acceptă completarea programabilă [Tab] și bibliotecile GNU readline pentru control extrem de flexibil asupra legăturilor de taste, editarea liniei de comandă și accesul la istoricul comenzilor. ksh are comanda fc relativ limitată (care bash acceptă, de asemenea) pentru „comanda de remediere” – adică să selectați elemente din istoricul dvs., să le trageți în sus în editorul de text preferat și să executați automat conținutul acelui fișier temporar editat la ieșire.

Dar bash acceptă asta și propriile sale emacs sau vi acces la istoric și editare și vechiul csh ! (bang) și operatori.

bash acceptă vi editare mode ( set -o vi ) care era, dacă îmi amintesc corect, implicit în ksh 93. Dar bash implicit la modul emacs ( set -o emacs ). În plus, desigur, se poate utiliza și comanda bash bind pentru a lega din nou orice taste pentru oricare dintr-un număr mare de funcții de editare și manipulare a istoricului, sau în macrocomenzi care se extind în orice text pe care ați putea dori să îl puneți pe o linie de comandă.

În plus bash are multe variabile de mediu „magice” care pot face lucruri aproape inimaginabil de subtile și complicate. De exemplu, puteți seta variabila PROMPT\_COMMAND pentru a executa un cârlig personalizat de fiecare dată când bash este pe cale să-și prezinte promptul. Așadar, ați putea verifica că există magie .dot\_file și personalizați din nou shell-ul în funcție de directorul dvs. sau resetați șirul de prompt și culorile ecranului terminalului. bazat pe ora din zi, sau interogați un site web și executați automat o comandă bazată pe … aproape orice.

(Am folosit acel cârlig pentru a activa automat mediile virtuale Python prin simpla schimbare în directorul lor de lucru de exemplu).

Când luați în considerare tcsh (sau strămoșul său, csh ) atunci te afli într-o nișă. Este obișnuit să vedeți scripturi csh în domeniul EDA (automatizarea designului electronic). Dar acesta este un accident istoric și majoritatea oamenilor care lucrează în acest domeniu nu folosesc tcsh pentru utilizarea lor interactivă.

div id = „0ec9e18bff”> pește coaja este, de asemenea, o nișă. Nu l-am folosit niciodată suficient pentru a-mi forma o părere și cu siguranță este suficient de colorat. Dar cred că va avea un rând foarte greu de sapat înainte de a cultiva un număr cu adevărat răspândit. Cu excepția cazului în care Apple ™ începe să îl livreze ca shell implicit pentru sistemele lor Mac ™, este probabil sortit să rămână în nișa sa pentru viitorul previzibil.

Așadar, sper că am făcut rost de acest lucru. Într-adevăr nu are prea mult rost să te întrebi „care este cel mai bun …” (aproape orice lucru în care există alternative rezonabile).

În cazul shell-urilor de comandă Unix, diferențele dintre shell-urile compatibile Bourne sunt atât de minor încât doar experții le pot distinge, iar aceștia au compromisuri și, în cele din urmă, se reduc la preferințe destul de subiective. Am colegi pasionați de setările lor zsh și de alții cărora le pasă. Sunt undeva între care m-am adaptat la cea mai ușoară alegere disponibilă.

Lasă un răspuns

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