Kada se govori o skriptovima ljuske u operativnim sistemima sličnim Unixu, dve ljuske se ističu: Bash (Bourne Again Shell) i Zsh (Z Shell). Za programere ili sistemske administratore, odabir između ove dve ljuske ima značajan uticaj na efikasnost i produktivnost.
Razumevanje razlika i sličnosti između ovih ljuski je ključno za optimizaciju radnog procesa komandne linije. Poznavanje specifičnosti svake ljuske pomoći će vam u donošenju informisanih odluka.
Šta su Bash i Zsh?
Bash je široko rasprostranjen, kako na Linux tako i na macOS sistemima. Predstavlja moćan alat za interakciju sa operativnim sistemom i izvršavanje komandi. Takođe, Bash se koristi za pisanje skriptova ljuske, automatizujući zadatke putem skripti koje sadrže više od jedne komande.
Zsh (Z shell) je naprednija verzija Bash-a, nudeći mnogo više funkcionalnosti. To je podrazumevana ljuska na macOS sistemima, a sve više dobija na popularnosti i na Linux sistemima.
Kako preći sa Bash na Zsh
Ako koristite Linux sistem i želite da pređete na Zsh, prvo ga instalirajte pomoću upravitelja paketa. Na primer, na Debianu ili Ubuntu sistemu, upotrebite sledeću komandu:
sudo apt install zsh
Nakon instalacije, prebacite se na Zsh pomoću ove komande:
chsh -s $(which zsh)
Ako koristite macOS, Zsh je već instaliran. Da biste ga aktivirali, pokrenite komandu:
chsh -s /bin/zsh
Da biste se vratili na Bash, zamenite Zsh sa Bash u gornjim komandama.
Za proveru koja ljuska je aktivna, koristite sledeću komandu:
echo $SHELL
Ovo će vam pomoći da potvrdite da koristite željenu ljusku.
Razlike između Zsh i Bash
Postoji nekoliko značajnih razlika između Zsh i Bash. Razmatranje ovih razlika pomoći će vam da izaberete ljusku koja najbolje odgovara vašim potrebama.
1. Prilagođavanje prompta
Zsh nudi jednostavniji način za prilagođavanje prompta korišćenjem escape sekvenci baziranih na %. Ovo omogućava dinamičke promptove sa bojama i informacijama. Prilagođavanje prompta se vrši definisanjem promenljive PS1 (Primary Prompt).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
Gornji prilagođeni prompt prikazuje korisničko ime, ime računara i trenutni direktorijum u različitim bojama:
Postoji mnogo drugih načina za prilagođavanje Zsh prompta, uključujući prikaz administratora, datuma i vremena, i memorisanje novog prompta.
Bash koristi malo drugačiji pristup prilagođavanju prompta. On koristi izlazne kodove za određivanje promena boja i formatiranja. Da biste postigli isto prilagođavanje kao kod Zsh-a, možete koristiti sledeći prompt:
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Upotreba `\[\033[0m\]` je ključna jer osigurava da promene boje ne utiču na tekst koji sledi iza prompta.
2. Podrška za asocijativne nizove
Zsh nativno podržava asocijativne nizove, koji predstavljaju pogodan način za povezivanje podataka radi lakše organizacije i preuzimanja informacija. Za eksplicitno deklarisanje asocijativnog niza koristi se naredba `declare -A`:
# Deklarisanje asocijativnog niza u Zsh
declare -A my_assoc_array
Vrednosti se zatim mogu dodeliti asocijativnom nizu:
my_assoc_array=(key1 value1 key2 value2)
I na kraju, vrednostima se pristupa korišćenjem njihovih ključeva:
echo $my_assoc_array[key1] # Izlaz: value1
Bash takođe ima ugrađenu podršku za asocijativne nizove od verzije 4.0. Deklarisanje i dodeljivanje vrednosti je isto kao u Zsh-u. Međutim, pristup vrednostima niza zahteva da se ključ stavi u vitičaste zagrade:
echo "${my_assoc_array[key1]}"
Osnovna razlika je u tome što je podrška asocijativnim nizovima u Zsh-u bogatija funkcionalnostima i naprednija od one u Bash-u. Zsh dozvoljava asocijativnim nizovima da imaju ključeve različitih tipova podataka, a ne samo stringove. Bash podržava samo string ključeve.
U ranijim verzijama Bash-a, morali ste da koristite zaobilazna rešenja ili spoljne alate za korišćenje asocijativnih nizova.
3. Prošireni obrasci globinga
Prošireni obrasci globinga pružaju moćan i fleksibilan način odabira i manipulacije datotekama i direktorijumima na osnovu različitih kriterijuma. Posebno su korisni kod složenih struktura datoteka ili kada je potrebna precizna kontrola nad izborom datoteka.
U Zsh skriptama, ovi obrasci se aktiviraju pomoću komande `setopt`. Na primer, za pronalaženje svih .txt datoteka u trenutnom direktorijumu:
setopt extended_glob
txt_files=(*.txt)
Za pronalaženje svih datoteka osim onih sa ekstenzijom .log:
setopt extended_glob
non_log_files=^(*.log)
U Bash-u se oni aktiviraju pomoću komande `shopt` sa opcijom `extglob`. Na primer, za pronalaženje svih .txt datoteka u trenutnom direktorijumu:
shopt -s extglob
txt_files=(*.txt)
Za pronalaženje svih datoteka osim onih sa ekstenzijom .log:
shopt -s extglob
non_log_files=!(*.log)
Glavna razlika između Zsh i Bash-a kod obrazaca globinga je komanda koja se koristi za njihovo aktiviranje. Takođe, neki operatori se razlikuju između ove dve ljuske.
4. Napredno proširenje parametara
Zsh podržava indirektno proširenje parametara, omogućavajući proširenje vrednosti promenljive čije je ime pohranjeno u drugoj promenljivoj. Ovo se postiže dodavanjem znaka uzvika (`!`) imenu promenljive.
name="foo"
result="${!name}"
echo "$result"
Bash, s druge strane, ne podržava nativno indirektno proširenje. Zaobilazno rešenje je korišćenje ugrađene komande `eval` ili sintakse `${!var}` za indirektne reference promenljivih.
name="world"
var="name"
echo ${!var} # Izlaz: world
Sličnosti između Bash i Zsh
Iako postoje razlike, Bash i Zsh takođe dele određene sličnosti.
1. Sintaksa komandne linije
Bash i Zsh dele sličnu sintaksu komandne linije. Ovo znači da će većina komandi i skripti koje napišete raditi u bilo kojoj ljusci bez potrebe za modifikacijama. Zsh je izgrađen na vrhu Bash-a, pa uključuje sve iste osnovne komande i funkcionalnosti.
Međutim, postoje veoma male razlike u sintaksi koje ćete morati da identifikujete i prilagodite.
2. Konzistentnost zamene komandi
Zamena komande je proces ugrađivanja izlaza jedne komande u drugu. Ovaj proces je dosledan između obe ljuske.
result=$(ls)
U Bash-u i Zsh-u možete koristiti sintaksu `$(command)` da zamenite izlaz komande u promenljivu, olakšavajući prenos skripti između dve ljuske.
3. Opcija za debagiranje skripti
I Bash i Zsh koriste `-x` zastavicu za debagiranje skripti. Kada pokrenete skriptu sa ovom zastavicom, ona prikazuje svaku komandu pre njenog izvršenja, što vam pomaže u identifikaciji problema u vašim skriptama.
# Debagiranje skripte u Bash i Zsh
#!/bin/bash -xecho "Debagiranje Bash skripte"
U ovom Bash skriptu, oznaka `-x` omogućava debagiranje. Sličan pristup se koristi u Zsh-u, samo zamenite `bash` sa `zsh`.
Razmatranja pri izboru između Zsh i Bash
- Kompatibilnost i prenosivost: Bash je podrazumevana ljuska na mnogim sistemima zasnovanim na Unix-u, što ga čini sigurnijim izborom za skriptiranje na više platformi. Ako vam je potrebno da skripte rade na različitim sistemima bez modifikacija, Bash je bolji izbor.
- Složenost skripti i napredne funkcionalnosti: Zsh pruža napredne funkcionalnosti kao što su asocijativni nizovi, prošireni obrasci globinga i napredno proširenje parametara, što pojednostavljuje složene zadatke skriptiranja. Ako vaše skripte zahtevaju naprednu manipulaciju stringovima ili strukturama podataka, Zsh je bolji izbor.
- Zajednica i ekosistem dodataka: I Bash i Zsh imaju aktivne zajednice, ali Zsh ima jaču zajednicu i bogati ekosistem dodataka i tema. Ako cenite prilagođavanje, Zsh-ova živa zajednica i podrška za dodatke mogu biti značajna prednost.
- Jednostavnost učenja: Ako tek počinjete sa skriptama ljuske, Bash je pristupačnija polazna tačka, sa obimnom dokumentacijom i resursima dostupnim početnicima, što olakšava učenje osnova skriptiranja ljuske.
Automatizacija zadataka pomoću skripti ljuske
Sposobnost automatizacije zadataka pomoću skripti ljuske je od velike važnosti. Možete automatizovati ponavljajuće zadatke i uštedeti mnogo vremena.
Takođe, možete koristiti ove skripte za upravljanje korisničkim nalozima, nadgledanje sistemskih resursa, pravljenje rezervnih kopija podataka i obavljanje rutinskog održavanja. Pažljivo napisane skripte mogu smanjiti mogućnost ljudske greške.