Zsh vs. Bash-skript. Vad är skillnaden?

By rik

Inom sfären av skalscripting på Unix-liknande operativsystem, framträder två distinkta aktörer: Bash (Bourne Again Shell) och Zsh (Z Shell). För utvecklare och systemadministratörer påverkar valet mellan dessa verktyg deras effektivitet och produktivitet avsevärt.

En grundläggande förståelse för de unika skillnaderna och de gemensamma likheterna mellan dessa två skal är avgörande för att optimera ditt arbetsflöde vid kommandoraden. Att känna till varje skals unika egenskaper gör det möjligt att fatta välgrundade beslut.

Vad är Bash och Zsh?

Bash är ett allmänt använt skal på både Linux- och macOS-system. Det fungerar som ett kraftfullt verktyg för att interagera med operativsystemet och exekvera kommandon. Dessutom tillåter Bash användare att skapa skalskript, vilket möjliggör automatisering av uppgifter genom att skriva sekvenser av kommandon.

Zsh (Z-skal), i sin tur, är en utökad version av Bash som erbjuder ett bredare utbud av funktioner och möjligheter. Det har antagits som standardskal på macOS och får stadigt popularitet på Linux-system.

Hur man byter från Bash till Zsh

För Linux-användare som vill byta till Zsh, börja med att installera det med din pakethanterare. Till exempel kan följande kommando användas på Debian eller Ubuntu:

 sudo apt install zsh 

När Zsh är installerat, använd det här kommandot för att byta till det:

 chsh -s $(which zsh) 

Om du använder macOS är Zsh förmonterat. För att byta till det, kör det här kommandot:

 chsh -s /bin/zsh 

För att återgå till Bash, byt ut Zsh mot Bash i kommandona ovan.

Använd följande kommando för att verifiera vilket skal du använder:

 echo $SHELL 

Det här kommandot hjälper dig att bekräfta att du använder önskat skal.

Skillnader mellan Zsh och Bash

Det finns en mängd skillnader mellan Zsh och Bash. Att ha dessa skillnader i åtanke är viktigt för att avgöra vilket skal som är lämpligast för dig.

1. Promptsanpassning

Zsh underlättar promptsanpassning genom användning av %-baserade escape-sekvenser, som tillåter att skapa dynamiska prompter med färger och information. För att anpassa din skalprompt, definiera variabeln PS1 (Primary Prompt).

 PS1="%F{green}%n@%m %F{blue}%~ %f$ " 

Den här anpassade prompten visar användarnamn, värdnamn och den aktuella katalogen i olika färger:

Zsh erbjuder många anpassningsalternativ, vilket gör det möjligt att inkludera en administratörsindikator, datum och tid samt spara den nya prompten.

Bash närmar sig promptsanpassning lite annorlunda, och använder escape-koder för att ange färg- och formatändringar. För att åstadkomma samma anpassning som i Zsh ovan, kan du använda den här anpassade prompten:

 PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ " 

Användningen av \[\033[0m\] är avgörande för att säkerställa att färgändringarna inte påverkar texten som följer prompten.

2. Stöd för associativa arrayer

Zsh ger inbyggt stöd för associativa arrayer. Dessa arrayer erbjuder ett praktiskt sätt att koppla data, vilket förenklar organiseringen och hämtningen av information. Använd kommandot declare -A för att uttryckligen deklarera en associativ array:

 # Deklarera en associativ array i Zsh 
declare -A my_assoc_array

Sedan kan du tilldela värden till den associativa arrayen:

 my_assoc_array=(key1 value1 key2 value2) 

Slutligen kan du komma åt värden med hjälp av deras nycklar:

 echo $my_assoc_array[key1] # Output: value1 

Bash har haft inbyggt stöd för associativa arrayer sedan version 4.0. Du deklarerar och tilldelar värden på liknande sätt som i Zsh. Vid åtkomst av arrayvärden måste nyckeln dock omslutas av krullparenteser:

 echo "${my_assoc_array[key1]}" 

Den viktigaste skillnaden är att Zshs stöd för associativa arrayer är mer avancerat och funktionsrikt än Bashs. Zsh tillåter associativa arrayer att ha nycklar av olika datatyper, inte bara strängar. Bash stöder endast strängnycklar.

I tidigare versioner av Bash var det nödvändigt att hitta alternativa metoder eller använda externa verktyg för att hantera associativa arrayer.

3. Utökade globbningsmönster

Utökade globbningsmönster erbjuder ett kraftfullt och flexibelt sätt att välja och manipulera filer och kataloger baserat på olika kriterier. De är användbara vid hantering av komplexa filstrukturer eller när exakt kontroll över filval är nödvändig.

I ett Zsh-skript kan dessa mönster aktiveras med kommandot setopt. För att t.ex. matcha alla .txt-filer i den aktuella katalogen:

 setopt extended_glob
txt_files=(*.txt)

För att matcha alla filer utom de med .log-ändelsen:

 setopt extended_glob
non_log_files=^(*.log)

I Bash måste du aktivera dem med kommandot shopt och alternativet extglob. För att t.ex. matcha alla .txt-filer i den aktuella katalogen:

 shopt -s extglob
txt_files=(*.txt)

För att matcha alla filer utom de med .log-ändelsen:

 shopt -s extglob
non_log_files=!(*.log)

Den största skillnaden mellan Zsh och Bash gällande globbningsmönster är kommandot som används för att aktivera dem. Observera att vissa operatorer skiljer sig åt mellan de två skalen.

4. Avancerad parameterexpansion

Zsh stöder indirekt expansion av parametrar, vilket möjliggör att utöka värdet av en variabel vars namn är lagrat i en annan variabel. För att uppnå detta, måste du inleda variabelnamnet med ett utropstecken !.

 name="foo"
result="${!name}"
echo "$result"

Bash å andra sidan stöder inte indirekt expansion inbyggt. Lösningen är att använda det inbyggda kommandot eval eller syntaxen ${!var} för indirekta variabelreferenser.

 name="world"
var="name"
echo ${!var} # Detta ger: world

Likheter mellan Bash och Zsh

Trots skillnaderna mellan Bash och Zsh delar de även vissa likheter.

1. Kommandoradssyntax

Bash och Zsh delar en liknande kommandoradssyntax. Detta är fördelaktigt eftersom det innebär att majoriteten av kommandon och skript du skriver kommer att fungera i båda skalen utan ändringar. Zsh är byggt på Bash och omfattar därmed samma grundläggande kommandon och funktioner.

Det finns dock några mindre skillnader i syntax som du kan behöva identifiera och justera.

2. Konsekvens i kommandosubstitution

Kommandosubstitution är processen att bädda in utdata från ett kommando i ett annat. Detta är konsekvent mellan båda skalen.

 result=$(ls) 

I både Bash och Zsh kan $(kommando)-syntaxen användas för att ersätta utdata från ett kommando med en variabel. Detta underlättar enkel portabilitet av skript mellan de två skalen.

3. Skriptfelsökningsalternativ

Både Bash och Zsh använder flaggan -x för skriptfelsökning. När du kör ett skript med den här flaggan visas varje kommando innan det exekveras. Detta underlättar identifieringen av potentiella problem i dina skript.

 # Felsöker ett skript i både Bash och Zsh
#!/bin/bash -x

echo "Felsöker Bash-skript"

I detta Bash-skript aktiverar flaggan -x felsökning. Du kan använda en liknande metod i Zsh; ersätt bara bash med zsh.

Överväganden vid valet mellan Zsh och Bash

  • Kompatibilitet och portabilitet: Bash är standardskalet i många Unix-baserade system. Detta gör det till ett säkrare alternativ för skript som används på flera plattformar. Om det är viktigt att dina skript fungerar på olika system utan ändringar, är Bash ett mer passande val.
  • Skriptkomplexitet och avancerade funktioner: Zsh erbjuder avancerade funktioner, såsom associativa arrayer, utökade globbningsmönster och avancerad parameterexpansion. Dessa förenklar komplexa skriptuppgifter. Om dina skript kräver avancerad strängmanipulation eller datastrukturer är Zsh ett bättre alternativ.
  • Gemenskap och plugin-ekosystem: Både Bash och Zsh har aktiva gemenskaper, men Zsh har en starkare gemenskap och ett större utbud av plugins och teman. Om anpassning är viktigt kan Zshs livfulla gemenskap och stöd för plugins vara en avsevärd fördel.
  • Lätt att lära sig: Om du är nybörjare på skalscripting är Bash ett mer tillgängligt ställe att börja på. Det finns omfattande dokumentation och resurser tillgängliga för nybörjare. Detta gör det lättare att lära sig grunderna i skalscripting.

Automatisera uppgifter med hjälp av skalskript

Att veta hur man automatiserar uppgifter med hjälp av skalskript är avgörande. Det gör det möjligt att automatisera repetitiva uppgifter och spara tid.

Du kan även använda dessa skript för att hantera användarkonton, övervaka systemresurser, säkerhetskopiera data och utföra rutinunderhåll. När de skrivs noggrant kan de också minska risken för mänskliga fel.