Ambele shell-uri oferă limbaje de scripting puternice, dar nu sunt complet compatibile.
Când vine vorba de scripturi shell pe sisteme de operare asemănătoare Unix, domină două shell-uri: Bash (Bourne Again Shell) și Zsh (Z Shell). Dacă sunteți programator sau administrator de sistem, alegerea dintre acestea două vă afectează semnificativ eficiența și productivitatea.
Înțelegerea diferențelor și asemănărilor dintre aceste două shell-uri vă va ajuta să vă optimizați fluxul de lucru din linia de comandă. Cunoașterea nuanțelor fiecărei cochilii vă va ajuta să luați decizii informate.
Ce sunt Bash și Zsh?
Bash este popular atât pe sistemele Linux, cât și pe macOS. Este un instrument puternic pe care îl puteți folosi pentru a interacționa cu sistemul de operare și pentru a rula comenzi. Poti de asemenea utilizați Bash pentru scripting shell, care automatizează sarcini prin scrierea de scripturi care conțin mai multe comenzi.
Zsh (Z shell) este o versiune extinsă a Bash care are multe mai multe caracteristici. Este shell-ul implicit pe macOS. De asemenea, devine din ce în ce mai popular pe sistemele Linux.
Cum să comutați de la Bash la Zsh
Dacă utilizați un sistem Linux și doriți să treceți la Zsh, începeți prin folosind 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 dvs., 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 utilizați, executați următoarea comandă:
echo $SHELL
Acest lucru vă va ajuta să confirmați că utilizați shell-ul pe care intenționați să îl utilizați.
Diferențele dintre Zsh și Bash
Există mai multe diferențe între Zsh și Bash. Luarea în considerare a acestor diferențe vă va ajuta să decideți care înveliș vi se potrivește cel mai bine.
1. Personalizare promptă
Zsh oferă o modalitate mai ușoară de personalizare a solicitărilor folosind %-secvente de evacuare bazate pe. Acest lucru permite solicitări dinamice cu culoare și informații. Pentru a personaliza promptul shell, definiți PS1 (Prompt primar).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
Promptul personalizat de mai sus afișează numele de utilizator, numele de gazdă și directorul curent în culori diferite:
Există multe alte moduri de a personaliza promptul Zsh, permițându-vă să setați un indicator de administrator, 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 promptă. Utilizează coduri de 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\]\$ "
Folosind \[\033[0m\] este crucial, deoarece se asigură că modificările de culoare nu afectează textul care urmează promptului.
2. Suport pentru matrice asociative
Zsh acceptă în mod nativ matricele asociative. Aceste matrice oferă o modalitate convenabilă de a asocia datele, ceea ce facilitează organizarea și preluarea informațiilor. Utilizare declara-A comandă pentru a declara în mod explicit o matrice asociativă:
# Declare an associative array in Zsh
declare -A my_assoc_array
Apoi puteți atribui valori matricei asociative:
my_assoc_array=(key1 value1 key2 value2)
Și, în sfârșit, accesați valorile folosind cheile lor:
echo $my_assoc_array[key1] # Outputs: value1
Bash a inclus suport nativ pentru tablourile asociative din versiunea 4.0. Declarați și atribuiți valori în același mod ca și în Zsh. Dar când vine vorba de accesarea valorilor matricei, trebuie să înfășurați cheia în paranteze:
echo "${my_assoc_array[key1]}"
Principala diferență este că suportul Zsh pentru tablourile asociative este mai bogat în funcții și mai avansat decât Bash. Zsh permite matricelor asociative să aibă chei de diferite tipuri de date, nu doar șiruri. Bash acceptă numai chei șir.
În versiunile anterioare de Bash, trebuie să găsiți o modalitate de soluții alternative sau să aveți instrumente externe pentru a utiliza matrice asociative.
3. Modele de globbing extinse
Modelele extinse de globbing oferă o modalitate puternică și flexibilă de a selecta și manipula fișiere și directoare pe baza diferitelor criterii. 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 setopt comanda. De exemplu, pentru a se potrivi cu toate .TXT fișiere din directorul curent:
setopt extended_glob
txt_files=(*.txt)
Pentru a potrivi 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 shopt comanda cu extglob opțiune. De exemplu, pentru a se potrivi cu toate .TXT fișiere din directorul curent:
shopt -s extglob
txt_files=(*.txt)
Pentru a potrivi toate fișierele, cu excepția celor cu .Buturuga extensie:
shopt -s extglob
non_log_files=!(*.log)
Principala diferență dintre Zsh și Bash atunci când vine vorba de modele globbing este comanda utilizată pentru a le activa. Cu toate acestea, observați că unii operatori sunt diferiți între cele două shell-uri.
4. Extindere 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 variabilei cu un semn de exclamare !.
name="foo"
result="${!name}"
echo "$result"
Bash, pe de altă parte, nu permite expansiunea indirectă în mod nativ. Soluția pentru aceasta este utilizarea eval comanda încorporată sau ${!var} sintaxă pentru referințele la variabile indirecte.
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, de asemenea, unele asemănări.
1. Sintaxa liniei de comandă
Bash și Zsh au o sintaxă similară în linia de comandă. Acest lucru este grozav deoarece înseamnă că majoritatea comenzilor și scripturilor pe care le scrieți vor funcționa în oricare dintre shell, fără modificări. Zsh este construit pe deasupra lui Bash, deci include toate aceleași comenzi și caracteristici de bază.
Există, totuși, diferențe foarte minore de sintaxă pe care va trebui să le identificați și să le ajustați.
2. Consecvența înlocuirii comenzilor
Înlocuirea comenzilor este procesul de încorporare a ieșirii unei comenzi în alta. Este consistent între ambele cochilii.
result=$(ls)
Atât în Bash, cât și în Zsh, puteți utiliza $(comandă) sintaxă pentru a înlocui rezultatul unei comenzi într-o variabilă. Acest lucru permite portabilitatea ușoară a scripturilor între cele două shell-uri.
3. Opțiunea de depanare a scripturilor
Atât Bash, cât și Zsh folosesc -X flag pentru depanarea scriptului. Când rulați un script cu acest indicator, acesta afișează fiecare comandă înainte de a rula. Acest lucru vă ajută să identificați problemele din scripturile dvs.
# Debugging a script in both Bash and Zsh
#!/bin/bash -x
echo "Debugging Bash script"
În acest script Bash, -X flag permite depanarea. Puteți utiliza o abordare similară în Zsh; doar înlocuiți bash cu zsh.
Considerații pentru alegerea între Zsh și Bash
- Compatibilitate și portabilitate: Bash este shell-ul implicit pe multe sisteme bazate pe Unix. Acest lucru îl face o alegere mai sigură pentru scripting-ul pe mai multe platforme. Dacă aveți nevoie de scripturile dvs. să ruleze pe o gamă largă de sisteme fără modificări, Bash este o opțiune mai bună.
- Complexitatea scriptului și caracteristici avansate: Zsh oferă funcții avansate, cum ar fi matrice asociative, modele extinse de globbing și extindere avansată a parametrilor. Acest lucru simplifică sarcinile complexe de scripting. Dacă scripturile dvs. necesită manipulare avansată de șiruri sau structuri de date, Zsh este o alegere mai bună.
- Comunitate și ecosistem de pluginuri: 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ă prețuiești personalizarea, comunitatea vibrantă și suportul pentru pluginuri Zsh pot fi un avantaj semnificativ.
- Ușurința de a învăța: Dacă sunteți nou în scripturile shell, Bash este un punct de plecare mai accesibil. Are documentație extinsă și resurse disponibile pentru începători. Acest lucru face mai ușor de învățat elementele de bază ale scripturilor shell.
Automatizarea sarcinilor folosind scripturi Shell
A ști cum să automatizezi sarcinile folosind scripturi shell este de mare importanță. Puteți automatiza sarcini repetitive și puteți economisi mult timp.
De asemenea, puteți utiliza aceste scripturi pentru a gestiona conturile de utilizator, pentru a monitoriza resursele de sistem, pentru a face copii de siguranță ale datelor și pentru a efectua întreținerea de rutină. Când sunt scrise cu atenție, ele pot reduce, de asemenea, potențialul de eroare umană.