Zsh vs. Bash Scripting. Wat is het verschil?
Als het aankomt op shellscripting op Unix-achtige besturingssystemen, domineren twee shells: Bash (Bourne Again Shell) en Zsh (Z Shell). Als je programmeur of systeembeheerder bent, heeft de keuze tussen deze twee een grote invloed op je efficiëntie en productiviteit.
Het begrijpen van de verschillen en overeenkomsten tussen deze twee shells kan voordelig zijn bij het optimaliseren van je commandoregelwerkproces, omdat kennis over hun specifieke eigenschappen het mogelijk maakt om goed geïnformeerde beslissingen te nemen.
Wat zijn Bash en Zsh?
Bash, een veelzijdige en veelgebruikte opdrachtregelinterface, biedt een uitgebreide reeks functies op verschillende platforms zoals Linux- en macOS-systemen. Als robuuste en efficiënte tool stelt het gebruikers in staat om naadloos te communiceren met hun besturingssystemen terwijl ze meerdere commando’s tegelijk uitvoeren. Daarnaast gaan de mogelijkheden van Bash verder dan basisinteracties door de ondersteuning voor shell scripting. Door scripts te gebruiken die uit meerdere commando’s bestaan, kunnen gebruikers terugkerende of tijdrovende taken efficiënt automatiseren, waardoor workflow-processen gestroomlijnd worden.
Zsh is een veelzijdige en functierijke commandoregelinterface die elementen van zowel het Mac- als het Linux-besturingssysteem bevat en die dient als standaard shell voor Apple’s macOS-platform, terwijl het tegelijkertijd steeds populairder wordt onder verschillende Linux-distributies.
Hoe over te stappen van Bash naar Zsh
Om naadloos over te stappen van een Linux besturingssysteem naar Zsh als je standaard shell, begin je met het gebruik van de respectievelijke pakketbeheerder van je distributie voor installatiedoeleinden. Als je bijvoorbeeld met een Debian- of Ubuntu-gebaseerd systeem werkt, voer dan het volgende commando uit:
sudo apt install zsh
Nadat je het programma op je computer hebt geïnstalleerd, kun je eenvoudig overschakelen op het gebruik ervan door een specifiek commando in je terminal of opdrachtprompt uit te voeren.
chsh -s $(which zsh)
Om over te schakelen naar de Zsh-shell op een Mac-besturingssysteem, voer je de volgende opdracht uit in je terminal:
chsh -s /bin/zsh
Om terug te gaan naar de Bash shell in plaats van Zsh, wijzig je gewoon de eerder gegeven commando’s door “Zsh” te vervangen door “Bash”.
Voer de volgende opdracht uit om de huidige shell die wordt gebruikt te achterhalen:
echo $SHELL
Het gebruik van een bevestigende maatregel kan helpen bij het valideren dat de gebruiker de gewenste operationele omgeving gebruikt, waardoor er meer zekerheid is over de gemaakte keuze.
Verschillen tussen Zsh en Bash
Het onderzoeken van de verschillen tussen Zsh en Bash is essentieel bij het bepalen welke van deze shells aansluit bij je voorkeuren en eisen.
Prompt aanpassen
Zsh biedt een handige methode om je commandoregelinterface te personaliseren door gebruik te maken van op procenten gebaseerde escape-reeksen binnen de primaire prompt, aangeduid als PS1. Door deze aanpak te gebruiken is het mogelijk om visueel aantrekkelijke en informatieve prompts te maken met elementen zoals kleur en dynamisch gegenereerde inhoud. Om het uiterlijk van je shell prompt aan te passen, moet je eerst de gewenste configuratie instellen door de PS1 variabele te definiëren.
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
De bovengenoemde aangepaste prompt toont de gebruikersnaam, domeinnaam en huidige werkmap van de gebruiker door middel van verschillende gekleurde visuele indicatoren:
Als alternatief bestaan er een groot aantal methoden om de Zsh-prompt te personaliseren, waarmee een administratieve aanduiding kan worden weergegeven, de huidige datum en tijd kunnen worden opgenomen en alle wijzigingen die in de bijgewerkte prompt zijn aangebracht, kunnen worden bewaard.
Bash gebruikt een alternatieve strategie voor promptpersonalisatie in vergelijking met Zsh. Het gebruik van escape-codes maakt het mogelijk om de kleur en het formaat van de prompt aan te passen. Om een vergelijkbaar niveau van aanpassing te bereiken als in het voorbeeld van Zsh, kan de volgende aangepaste promptsjabloon gebruikt worden:
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Het gebruik van \[\033[0m\]
is essentieel, omdat het garandeert dat wijzigingen in de kleur geen invloed hebben op de volgende tekst in het commando of bericht.
Ondersteuning voor associatieve arrays
Zsh, een programmeertaal voor Unix-achtige systemen, kent het concept van associatieve arrays. Associatieve arrays zijn in wezen verzamelingen van sleutel-waarde paren die het organiseren en ophalen van informatie met het grootste gemak vergemakkelijken. Om een associatieve matrix te maken, kan het sleutelwoord “declare” gevolgd door “-A” gebruikt worden om het bestaan ervan expliciet aan te geven.
# Declare an associative array in Zsh
declare -A my_assoc_array
Daarna kan men de associatieve array voorzien van toegewezen waarden.
my_assoc_array=(key1 value1 key2 value2)
Om de waarden geassocieerd met de sleutels van een woordenboek op te halen, kan men indexering gebruiken om direct naar die waarden te verwijzen en ze te benaderen. Hierbij wordt de gewenste sleutel gespecificeerd en als index gebruikt om de corresponderende waarde in het woordenboek te verkrijgen.
echo $my_assoc_array[key1] # Outputs: value1
Bash biedt vanaf versie 4 native ondersteuning voor associatieve arrays. Het proces van het declareren en toewijzen van waarden is vergelijkbaar met dat in Zsh.Als het echter aankomt op het ophalen van array-elementen, moet men de index omsluiten met accolades, {}.
echo "${my_assoc_array[key1]}"
Een opmerkelijk verschil tussen Zsh en Bash ligt in hun respectievelijke mogelijkheden met betrekking tot associatieve arrays. Hoewel beide shells dergelijke functionaliteit bieden, biedt Zsh een uitgebreidere set mogelijkheden voor deze gegevensstructuren. Specifiek staat Zsh associatieve arrays toe met sleutelwaarden van verschillende datatypes buiten alleen tekstuele tekenreeksen; terwijl Bash zijn sleutels beperkt tot uitsluitend tekenreekselementen.
In vorige versies van de programmeertaal Bash was het voor het gebruik van associatieve arrays nodig om workarounds te implementeren of externe tools te gebruiken.
Uitgebreide glob-patronen
Uitgebreide glob-patronen bieden een robuuste en veelzijdige methode voor het selecteren en manipuleren van bestanden en mappen op basis van meerdere criteria, waardoor ze vooral nuttig zijn in situaties met ingewikkelde mappenstructuren of veeleisende granulariteitsniveaus in de bestandsselectie.
Om specifieke criteria voor het matchen van patronen te activeren in een Zsh-script met behulp van het setopt
commando, kan een bepaalde bestandsextensie worden opgegeven die van belang is voor de huidige werkmap. Om dit doel te bereiken, voer je simpelweg de opdracht setopt
uit, gevolgd door de gewenste bestandsextensie, zoals .txt
, waardoor tekstbestanden met dat achtervoegsel binnen de huidige mapcontext worden herkend en verwerkt.
setopt extended_glob
txt_files=(*.txt)
" .jpg\ -not *.log". Dit selecteert alle bestanden die een “.jpg” of “.jpeg” bestandsextensie hebben en geen overeenkomende “.log” extensie bezitten.
setopt extended_glob
non_log_files=^(*.log)
Om uitgebreide globbing patronen te gebruiken in de Bash shell, moet deze functie geactiveerd worden door het “shopt” commando te gebruiken samen met de “extglob” optie. Ter illustratie, als iemand alle bestanden eindigend op “.txt” in de huidige werkdirectory wil identificeren en verwerken, dan zou hij de volgende code invoeren:
shopt -s extglob
txt_files=(*.txt)
Om bestanden met een “.log” bestandsextensie uit te sluiten, kun je het volgende reguliere expressiepatroon gebruiken in je grep commando:css[^. ]\*.log$ Hiermee wordt gezocht naar elke tekenreeks die niet begint met een punt (het is dus geen bestandsnaam die eindigt op “.log”), gevolgd door “\.log”. Dit komt overeen met elke tekenreeks die eindigt op “.log”, wat de meeste logbestanden zou moeten bevatten, maar andere typen tekstbestanden of mappen uitsluit.
shopt -s extglob
non_log_files=!(*.log)
In termen van glob pattern matching bestaat er een belangrijk verschil tussen Zsh en Bash met betrekking tot de respectievelijke commando’s die gebruikt worden om deze patronen in te schakelen. Er moet echter opgemerkt worden dat bepaalde operatoren die door elke shell gebruikt worden, kunnen verschillen.
Geavanceerde parameteruitbreiding
Zsh biedt de mogelijkheid van indirecte parameteruitbreiding, wat de evaluatie mogelijk maakt van een variabele waarvan de naam in een andere variabele zit. Om deze bewerking uit te voeren, is het nodig om de naam van de variabele vooraf te laten gaan door een uitroepteken, aangeduid met “!”.
name="foo"
result="${!name}"
echo "$result"
Bash ondersteunt inherent geen indirecte variabele-uitbreidingen. Er zijn echter workarounds beschikbaar zoals het gebruik van het eval
ingebouwde commando of het gebruik van de ${!variable}
syntaxis om indirecte verwijzing van variabelen te bereiken.
name="world"
var="name"
echo ${!var} # This will output: world
Overeenkomsten tussen Bash en Zsh
Ondanks de verschillen die bestaan tussen Bash en Zsh, zijn er ook bepaalde overeenkomsten tussen beide waar te nemen.
Commandoregelsyntax
Bash en Zsh gebruiken een analoge structuur voor hun commandoregelinterfaces, wat naadloze onderlinge interoperabiliteit mogelijk maakt. Hierdoor kunnen de meeste directieven en scripts in beide shells worden uitgevoerd zonder dat er aanpassingen nodig zijn. Het feit dat Zsh gebouwd is op de basis van Bash betekent dat het alle fundamentele mogelijkheden en functies bevat.
Hoewel er enkele kleine verschillen in grammaticale structuur kunnen zijn die aandacht nodig hebben, is het belangrijk om deze zorgvuldig te overwegen en aan te pakken.
Commandosubstitutie Consistentie
Commandosubstitutie is een techniek die wordt gebruikt bij het uitvoeren van commando’s waarbij het resultaat of de uitvoer van het ene commando als argument wordt opgenomen in een ander commando, waardoor uniformiteit in verschillende shell-omgevingen wordt gewaarborgd.
result=$(ls)
Zowel Bash als Zsh bieden een vergelijkbare functionaliteit door het gebruik van de $(command) syntaxis, waarmee de uitvoer van een commando in een variabele kan worden vervangen. Deze functie faciliteert naadloze interoperabiliteit tussen de twee shell types met behoud van scriptcompatibiliteit op verschillende platformen.
Script Debugging Option
Zowel Bash als Zsh gebruiken de vlag -x
om het debuggen van scripts te vergemakkelijken. Door een script met deze vlag uit te voeren, wordt elk commando weergegeven voordat het wordt uitgevoerd. Hierdoor kunnen gebruikers eventuele afwijkingen in hun scripts ontdekken.
# Debugging a script in both Bash and Zsh
#!/bin/bash -x
echo "Debugging Bash script"
Het gebruik van de -x
vlag in dit Bash script dient om het debuggen te vergemakkelijken. Deze functionaliteit kan ook worden gerepliceerd in een Zsh-context door bash
te vervangen door zsh
, waardoor de voordelen in de laatstgenoemde shell-omgeving worden geïntegreerd.
Overwegingen bij de keuze tussen Zsh en Bash
De prevalentie van Bash als standaard shell op vele Unix-gebaseerde platformen geeft het een verhoogde mate van compatibiliteit en transporteerbaarheid, waardoor het een veiligere keuze is voor scripts voor meerdere systemen die minimale aanpassingen vereisen op verschillende hardware-architecturen.
Zsh biedt een scala aan geavanceerde mogelijkheden, zoals associatieve arrays, verbeterde glob patronen en ingewikkelde parameter uitbreidingsopties die high-level scripting processen vereenvoudigen. Deze eigenschappen zijn vooral gunstig voor degenen die superieure tekenreeksverwerking en structurele complexiteit in hun scripts eisen.
De Bash en Zsh shells hebben beide een bloeiende gemeenschap, maar de laatste heeft een robuustere gemeenschap en een uitgebreide reeks plugins en thema’s om uit te kiezen. Voor mensen die personalisatie belangrijk vinden, kan dit een groot voordeel zijn ten gunste van Zsh.
Bash, een intuïtieve en veelgebruikte shell, dient als een toegankelijke ingang voor diegenen die niet bekend zijn met shell scripting. De overvloedige documentatie en beginnersgeoriënteerde materialen vereenvoudigen het proces om fundamentele concepten in dit domein te begrijpen.
Taken automatiseren met behulp van shell scripts
Het goed gebruiken van scripttalen om processen te stroomlijnen door het implementeren van shell scripts is van grote waarde. Door terugkerende taken te mechaniseren kan een aanzienlijke hoeveelheid tijd worden bespaard.
Naast het beheren van gebruikersaccounts, het bewaken van systeembronnen, het back-uppen van gegevens en het uitvoeren van routineonderhoud, kunnen deze scripts worden gebruikt om de kans op menselijke onoplettendheid te minimaliseren.