Zsh versus Bash-scripting. Wat is het verschil?

Zsh versus Bash-scripting. Wat is het verschil?
Lezers zoals jij helpen MUO te ondersteunen. Wanneer u een aankoop doet via links op onze site, kunnen we een partnercommissie verdienen. Lees verder.

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.





MUO-video van de dag SCROLL OM DOOR TE GAAN MET INHOUD

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:

hoe de speciale video-ram op een laptop te vergroten
 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:

  Zsh-promptaanpassing op de terminal

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="\[3[32m\]\u@\h \[3[34m\]\w \[3[0m\]$ " 

Gebruik makend van \[3[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 globale 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 shopt 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 ${!was} 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. Syntaxis van de opdrachtregel

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.

productieve dingen om te doen op internet

2. Consistentie van commandovervanging

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.