În ceea ce privește scripturile de tip shell pe sistemele de operare tip Unix, două shell-uri domină: Bash (Bourne Again Shell) și Zsh (Z Shell). Dacă sunteți programator sau administrator de sistem, alegerea dintre aceste două are un impact semnificativ asuprea eficienței și productivității dumneavoastră.
Înțelegerea diferențelor și asemănările dintre aceste două shell-uri vă ajută să vă optimizați fluxul de lucru în linia de comandă. Cunoașterea aspectelor fiecărui shell vă va ajuta să luați decizii în cunoștință de cauză.
Cuprins
Ce sunt Bash și Zsh?
Bash este popular atât pe sistemele GNU/Linux, cât și pe macOS. Este un instrument puternic pe care îl puteți utiliza pentru a interacționa cu sistemul de operare și pentru a rula comenzi. De asemenea, puteți utiliza Bash pentru scripting shell, care automatizează sarcinile prin scrierea de scripturi care conțin mai multe comenzi.
Zsh (Z Shell) este o versiune extinsă a lui Bash care are mult mai multe caracteristici. Este shell-ul implicit pe macOS. De asemenea, devine din ce în ce mai popular pe sistemele GNU/Linux.
Cum să treceți de la Bash la Zsh
Dacă folosiți un sistem GNU/Linux și doriți să treceți la Zsh, începeți prin a utiliza managerul de pachete pentru a-l instala. De exemplu, pe Debian sau Ubuntu, utilizați următoarea comandă:
sudo apt install zsh
După ce l-ați instalat pe sistemul dumneavoastră, treceți la el executând următoarea comandă:
chsh -s $(which zsh)
Dacă utilizați macOS, Zsh este deja instalat. Pentru a trece la acesta, rulați următoarea comandă:
chsh -s /bin/zsh
Pentru a reveni la Bash, înlocuiți Zsh cu Bash în comenzile de mai sus.
Pentru a verifica ce shell folosiți, rulați următoarea comandă:
echo $SHELL
Diferențe între Zsh și Bash
Există câteva diferențe între Zsh și Bash. Luând în calcul aceste diferențe vă va ajuta să decideți care shell vi se potrivește cel mai bine.
1. Personalizarea promptului
Zsh oferă o modalitate mai ușoară de personalizare a promptului utilizând instrucțiuni de tip „escape” bazate pe %. Acest lucru permite crearea de prompt-uri dinamice cu culori și informații. Pentru a vă personaliza promptul de shell, definiți PS1 (Primary Prompt).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
Instrucțiunea personalizată de mia sus afișează numele de utilizator, numele de gazdă și directorul curent în culori diferite.
Există multe alte modalități de a personaliza promptul Zsh, permițându-vă să setați un indicator de administrare, să includeți data și ora și să salvați noul prompt.
Bash folosește o abordare ușor diferită atunci când vine vorba de personalizarea promptului. Acesta folosește coduri de timp „escape” pentru a specifica modificările de culoare și formatare în prompt. Pentru a obține aceeași personalizare ca Zsh de mai sus, puteți utiliza următorul prompt personalizat.
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Utilizarea lui \[\033[0m\] este crucială deoarece asigură faptul că schimbările de culoare nu afectează textul care urmează după prompt.
2. Suport pentru array-uri asociative
Zsh suportă în mod nativ array-uri asociative. Aceste array-uri oferă o modalitate convenabilă de asociere a datelor, ceea ce facilitează organizarea și recuperarea informațiilor. Utilizați comanda declare -A pentru a declara în mod explicit un array asociative:
# Declară un array asociativ în Zsh
declare -A my_assoc_array
Puteți apoi să atribuiți valori la tabloul asociativ:
my_assoc_array=(key1 value1 key2 value2)
Și, în cele din urmă, accesați valorile folosind cheile acestora:
echo $my_assoc_array[key1] # Outputs: value1
Bash a inclus suport nativ pentru array-uri asociative încă din versiunea 4.0. puteți declara și atribui valori in același mod ca în Zsh. Dar când vine vorba de accesarea valorilor din array, trebuie să includeți cheia între acolade:
echo "${my_assoc_array[key1]}"
Principala diferență constă în faptul că suportul Zsh pentru array-uri asociative este mai bogat în funcții și mai avansat decât Bash. Zsh permite ca array-urile asociative să aibă chei de diferite tipuri de date, nu doar șiruri de caractere. Bash acceptă doar chei de tip șir de caractere.
În versiunile anterioare ale Bash, trebuia să găsiți o modalitate de a rezolva problema sau să dispuneți de instrumente externe pentru a utiliza array-uri asociative.
3. Modele extinse de timp Globbing
Modelele extinse de tip globbing oferă o modalitate puternică de flexibilitate de a selecta și manipula fișiere și directoare pe baza unor criterii diferite. Acestea sunt utile atunci când lucrați cu structuri complexe de fișiere sau când aveți nevoie de un control precis asupra selecțiilor de fișiere.
Într-un script Zsh, puteți activa aceste modele folosind comanda setopt. De exemplu, pentru a se potrivi cu toate fișierele .txt din directorul curent:
setopt extended_glob
txt_files=(*.txt)
Pentru a se potrivi cu toate fișierele, cu excepția celor cu extensia .log:
setopt extended_glob
non_log_files=^(*.log)
În Bash, trebuie să le activați folosind comanda shopt cu opțiunea extglob. De exemplu, pentru a potrivi toate fișierele .txt din directorul curent:
shopt -s extglob
txt_files=(*.txt)
Pentru a se potrivi cu toate fișierele, cu excepția celor cu extensia .log:
shopt -s extglob
non_log_files=!(*.log)
Principala diferență între Zsh și Bash în ceea ce privește modelele de tip globbing este comanda utilizată pentru a le activa. Totuși, observați că unii indicatori sunt diferiți între cele doua shell-uri.
4. Extinderea avansată a parametrilor
Zsh acceptă extinderea indirectă a parametrilor. Acest lucru vă permite să extindeți valoarea unei variabile al cărei nume este stocat într-o altă variabilă. Pentru a realiza acest lucru, trebuie să prefixați numele variabile cu un semn de exclamare !.
name="foo"
result="${!name}"
echo "$result"
Pe de altă parte, Bash nu permite expansiunea indirectă în mod nativ. Soluția este utilizarea comenzii eval sau a sintaxei ${!var} pentru referințe indirecte la variabile.
name="world"
var="name"
echo ${!var} # This will output: world
Asemănări între Bash și Zsh
Deși există diferențe între Bash și Zsh, acestea au și unele asemănări.
1. Sintaxa liniei de comandă
Bash și Zsh au în comun o sintaxă similară a liniei de comandă. Acest lucru este excelent, deoarece înseamnă că majoritatea comenzilor și scripturilor pe care le scrieți vor funcționa în oricare dintre cele doua shell-uri, fără modificări.
Zsh este construit pe baza lui Bash, deci include aceleași comenzi și caracteristici de bază. Cu toate acestea, există diferențe foarte mici de sintaxă pe care va trebui să le identificați și să le adaptați.
2. Consecvența substituției comenzilor
Substituirea comenzilor este procesul de încorporare a ieșirii unei comenzi în alta. Acest lucru este consecvent între ambele shell-uri.
result=$(ls)
Atât în Bash, cât și în Zsh, puteți utiliza sintaxa $(comandă) pentru a înlocui rezultatul unei comenzi într-o variabilă. Acest lucru permite o portabilitate ușoară a scripturilor între cele două shell-uri.
3. Opțiunea de depanare a scripturilor
Atât Bash, cât și Zsh utilizează indicatorul -x pentru depanarea scripturilor. Atunci când rulați un script cu acest indicator, acesta afișează fiecare comandă înainte de a fi executată. Acest lucru vă ajută să identificați problemele din scripturile dumneavoastră.
# Depanarea unui script atât în Bash cât și în Zsh
#!/bin/bash -x
echo "Depanarea scriptului Bash"
În acest script Bash, indicatorul -x activează depanarea. Puteți utiliza o abordare similară în Zsh; înlocuiți doar bash cu zsh.
Aspecte de luat în considerare pentru a alege între Zsh și Bash
- Compatibilitate și portabilitate: Bash este shell-ul implicit pe mai multe sisteme bazate pe Unix. Acest lucru îl face să fie o alegere mai sigură pentru crearea de scripturi între platforme. Dacă aveți nevoie ca scripturile dvs. să ruleze pe o gamă largă de sisteme fără modificări, Bash este o opțiune mai bună.
- Complexitatea scripturilor și caracteristicilor avansate: Zsh oferă caracteristici avansate, cum ar fi array-uri asociate, modele extinse de globbing și expansiune avansată a parametrilor. Acest lucru simplifică sarcinile complexe de scripting. Dacă scripturile dvs. necesită o manipulare avansată a șirurilor de caractere sau structuri de date, Zsh este o alegere mai bună.
- Comunitatea și ecosistemul de plugin-uri: Atât Bash, cât și Zsh au comunități active, dar Zsh are o comunitate mai puternică și un ecosistem extins de plugin-uri și teme. Dacă țineți la personalizare, comunitatea vibrantă și suportul pentru plugin-uri de la Zsh pot reprezenta un avantaj semnificativ.
- Ușurința de învățare: Dacă sunteți nou în domeniul scripturilor shell, Bash este un punct de plecare mai accesibil. Dispune de o documentație extinsă și de resurse disponibile pentru începători. Acest lucru facilitează învățarea noțiunilor de bază ale scripturilor shell.
Automatizarea sarcinilor cu ajutorul scripturilor Shell
Cunoașterea modului de automatizare a sarcinilor cu ajutorul scripturilor shell este de mare importanța. Puteți automatiza sarcinile repetitive și puteți economisi mult timp.
De asemenea, puteți utiliza aceste scripturi pentru a gestiona conturile de utilizator, pentru a monitoriza resursele sistemului, pentru a face copii de siguranța ale datelor și pentru a efectua lucrări de întreținere de rutină.
Atunci când sunt scrise cu atenție, aceste pot reduce, de asemenea, potențialul de greșeală umană.