Beide shells bieden krachtige scripttalen, maar ze zijn niet volledig compatibel.
Als het gaat om shell-scripting op Unix-achtige besturingssystemen, domineren twee shells: Bash (Bourne Again Shell) en Zsh (Z Shell). Als u programmeur of systeembeheerder bent, heeft de keuze tussen deze twee een aanzienlijke invloed op uw efficiëntie en productiviteit.
Als u de verschillen en overeenkomsten tussen deze twee shells begrijpt, kunt u uw opdrachtregelworkflow optimaliseren. Als u de nuances van elke schaal kent, kunt u weloverwogen beslissingen nemen.
Wat zijn Bash en Zsh?
Bash is populair op zowel Linux- als macOS-systemen. Het is een krachtig hulpmiddel dat u kunt gebruiken om met het besturingssysteem te communiceren en opdrachten uit te voeren. Je kan ook gebruik Bash voor shell-scripting, dat taken automatiseert door scripts te schrijven die meer dan één opdracht bevatten.
Zsh (Z-shell) is een uitgebreide versie van Bash die veel meer functies heeft. Het is de standaardshell op macOS. Het wordt ook steeds populairder op Linux-systemen.
Hoe u kunt overschakelen van Bash naar Zsh
Als u een Linux-systeem gebruikt en wilt overstappen naar Zsh, begin dan met gebruik uw pakketbeheerder om het te installeren. Gebruik bijvoorbeeld op Debian of Ubuntu de volgende opdracht:
sudo apt install zsh
Nadat u het op uw systeem hebt geïnstalleerd, kunt u ernaar overschakelen door de volgende opdracht uit te voeren:
chsh -s $(which zsh)
Als u macOS gebruikt, is Zsh al geïnstalleerd. Om ernaar over te schakelen, voert u de volgende opdracht uit:
chsh -s /bin/zsh
Om terug te schakelen naar Bash, vervangt u Zsh door Bash in de bovenstaande opdrachten.
Om te controleren welke shell u gebruikt, voert u de volgende opdracht uit:
echo $SHELL
Dit zal u helpen te bevestigen dat u de shell gebruikt die u van plan was.
Verschillen tussen Zsh en Bash
Er zijn verschillende verschillen tussen Zsh en Bash. Als u deze verschillen in overweging neemt, kunt u beslissen welke schaal het beste bij u past.
1. Snelle aanpassing
Zsh biedt een eenvoudigere manier om uw aanwijzingen aan te passen met behulp van %-gebaseerde ontsnappingssequenties. Dit maakt dynamische aanwijzingen met kleur en informatie mogelijk. Om uw shell-prompt aan te passen, definieert u de PS1 (Primaire prompt).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
De bovenstaande aangepaste prompt geeft de gebruikersnaam, hostnaam en huidige map in verschillende kleuren weer:
Er zijn veel andere manieren om de Zsh-prompt aan te passen, waarmee u een beheerdersindicator kunt instellen, de datum en tijd kunt toevoegen en de nieuwe prompt kunt opslaan.
Bash gebruikt een iets andere aanpak als het gaat om snelle aanpassingen. Het maakt gebruik van escape-codes om kleur- en opmaakwijzigingen in de prompt op te geven. Om dezelfde aanpassing te bereiken als Zsh hierboven, kunt u de volgende aangepaste prompt gebruiken.
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Gebruik makend van \[\033[0m\] is van cruciaal belang omdat het ervoor zorgt dat de kleurveranderingen geen invloed hebben op de tekst die volgt op de prompt.
2. Ondersteuning voor associatieve arrays
Zsh ondersteunt native associatieve arrays. Deze arrays bieden een handige manier om gegevens te associëren, waardoor het gemakkelijk wordt om informatie te organiseren en op te halen. Gebruik verklaren-A commando om expliciet een associatieve array te declareren:
# Declare an associative array in Zsh
declare -A my_assoc_array
Vervolgens kunt u waarden toewijzen aan de associatieve array:
my_assoc_array=(key1 value1 key2 value2)
En ten slotte krijgt u toegang tot de waarden met behulp van hun sleutels:
echo $my_assoc_array[key1] # Outputs: value1
Bash heeft native ondersteuning voor associatieve arrays toegevoegd sinds versie 4.0. U declareert en wijst waarden toe op dezelfde manier als in Zsh. Maar als het gaat om toegang tot arraywaarden, moet u de sleutel tussen accolades plaatsen:
echo "${my_assoc_array[key1]}"
Het belangrijkste verschil is dat de ondersteuning van Zsh voor associatieve arrays rijker en geavanceerder is dan Bash. Met Zsh kunnen associatieve arrays sleutels van verschillende gegevenstypen hebben, niet alleen tekenreeksen. Bash ondersteunt alleen snaartoetsen.
In eerdere versies van Bash moet je een manier bedenken om dit te omzeilen of externe tools gebruiken om associatieve arrays te gebruiken.
3. Uitgebreide Globbing-patronen
Uitgebreide globbing-patronen bieden een krachtige en flexibele manier om bestanden en mappen te selecteren en te manipuleren op basis van verschillende criteria. Ze zijn handig als u met complexe bestandsstructuren werkt of als u nauwkeurige controle over bestandsselecties nodig heeft.
In een Zsh-script kunt u deze patronen inschakelen met behulp van de instellen commando. Bijvoorbeeld om alles te matchen .tekst bestanden in de huidige map:
setopt extended_glob
txt_files=(*.txt)
Om alle bestanden te matchen, behalve die met de extensie .log:
setopt extended_glob
non_log_files=^(*.log)
In Bash moet je ze inschakelen met behulp van de winkel commando met de extglob keuze. Bijvoorbeeld om alles te matchen .tekst bestanden in de huidige map:
shopt -s extglob
txt_files=(*.txt)
Om alle bestanden te matchen, behalve die met .log verlenging:
shopt -s extglob
non_log_files=!(*.log)
Het belangrijkste verschil tussen Zsh en Bash als het gaat om globbing-patronen is de opdracht die wordt gebruikt om ze in te schakelen. Merk echter op dat sommige operatoren verschillend zijn tussen de twee shells.
4. Geavanceerde parameteruitbreiding
Zsh ondersteunt de indirecte uitbreiding van parameters. Hiermee kunt u de waarde uitbreiden van een variabele waarvan de naam in een andere variabele is opgeslagen. Om dit te bereiken, moet u de naam van de variabele vooraf laten gaan door een uitroepteken !.
name="foo"
result="${!name}"
echo "$result"
Bash daarentegen staat van nature geen indirecte uitbreiding toe. De oplossing hiervoor is het gebruik van de evalueer ingebouwde opdracht of de ${!var} syntaxis voor verwijzingen naar indirecte variabelen.
name="world"
var="name"
echo ${!var} # This will output: world
Overeenkomsten tussen Bash en Zsh
Hoewel er verschillen zijn tussen Bash en Zsh, delen ze ook enkele overeenkomsten.
1. Commandoregelsyntaxis
Bash en Zsh delen een vergelijkbare opdrachtregelsyntaxis. Dit is geweldig omdat het betekent dat de meeste opdrachten en scripts die u schrijft in beide shells zullen werken, zonder aanpassingen. Zsh is bovenop Bash gebouwd en bevat dus dezelfde basisopdrachten en functies.
Er zijn echter zeer kleine verschillen in de syntaxis die u moet identificeren en aanpassen.
2. Consistentie van opdrachtvervanging
Commandovervanging is het proces waarbij de uitvoer van het ene commando in het andere wordt ingebed. Het is consistent tussen beide shells.
result=$(ls)
In zowel Bash als Zsh kun je de $(opdracht) syntaxis om de uitvoer van een opdracht in een variabele te vervangen. Dit maakt een gemakkelijke overdraagbaarheid van scripts tussen de twee shells mogelijk.
3. Optie voor foutopsporing in scripts
Zowel Bash als Zsh gebruiken -X vlag voor foutopsporing in scripts. Wanneer u een script met deze vlag uitvoert, wordt elke opdracht weergegeven voordat deze wordt uitgevoerd. Dit helpt u bij het identificeren van problemen in uw scripts.
# Debugging a script in both Bash and Zsh
#!/bin/bash -x
echo "Debugging Bash script"
In dit Bash-script wordt de -X flag maakt foutopsporing mogelijk. Je kunt een vergelijkbare aanpak gebruiken in Zsh; gewoon vervangen bashen met zsh.
Overwegingen bij het kiezen tussen Zsh en Bash
- Compatibiliteit en draagbaarheid: Bash is de standaardshell op veel Unix-gebaseerde systemen. Dit maakt het een veiligere keuze voor platformonafhankelijke scripting. Als u wilt dat uw scripts zonder aanpassingen op een breed scala aan systemen kunnen worden uitgevoerd, is Bash een betere optie.
- Scriptcomplexiteit en geavanceerde functies: Zsh biedt geavanceerde functies zoals associatieve arrays, uitgebreide globale patronen en geavanceerde parameteruitbreiding. Dit vereenvoudigt complexe scripttaken. Als uw scripts geavanceerde stringmanipulatie of datastructuren vereisen, is Zsh een betere keuze.
- Community- en plug-in-ecosysteem: Zowel Bash als Zsh hebben actieve communities, maar Zsh heeft een sterkere community en een uitgebreid ecosysteem van plug-ins en thema's. Als u maatwerk waardeert, kan de levendige community en plug-inondersteuning van Zsh een aanzienlijk voordeel zijn.
- Gemakkelijk te leren: Als shell-scripting nieuw voor je is, is Bash een toegankelijker startpunt. Er is uitgebreide documentatie en bronnen beschikbaar voor beginners. Dit maakt het gemakkelijker om de basisbeginselen van shell-scripting te leren.
Taken automatiseren met behulp van shell-scripts
Weten hoe je taken kunt automatiseren met behulp van shellscripts is van groot belang. U kunt repetitieve taken automatiseren en veel tijd besparen.
U kunt deze scripts ook gebruiken om gebruikersaccounts te beheren, systeembronnen te bewaken, een back-up van gegevens te maken en routineonderhoud uit te voeren. Als ze zorgvuldig zijn geschreven, kunnen ze ook de kans op menselijke fouten verkleinen.