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

När det kommer till skalskript på Unix-liknande operativsystem dominerar två skal: Bash (Bourne Again Shell) och Zsh (Z Shell). Om du är programmerare eller systemadministratör påverkar valet mellan dessa två avsevärt din effektivitet och produktivitet.

Att förstå skillnaderna och likheterna mellan dessa två skal hjälper dig att optimera ditt kommandoradsarbetsflöde. Att veta om nyanserna i varje skal hjälper dig att fatta välgrundade beslut.

Vad är Bash och Zsh?

Bash är populärt på både Linux- och macOS-system. Det är ett kraftfullt verktyg som du kan använda för att interagera med operativsystemet och köra kommandon. Du kan också använda Bash för skalskript, som automatiserar uppgifter genom att skriva skript som innehåller mer än ett kommando.

Zsh (Z-skal) är en utökad version av Bash som har många fler funktioner. Det är standardskalet på macOS. Det blir också allt mer populärt på Linux-system.

Hur man byter från Bash till Zsh

Om du använder ett Linux-system och vill byta till Zsh, börja med att använda din pakethanterare för att installera det. Till exempel, på Debian eller Ubuntu, använd följande kommando:

 sudo apt install zsh 

När du har installerat det på ditt system, växla till det genom att köra följande kommando:

 chsh -s $(which zsh) 

Om du använder macOS är Zsh redan installerat. För att byta till det kör följande kommando:

 chsh -s /bin/zsh 

För att byta tillbaka till Bash, ersätt Zsh med Bash i ovanstående kommandon.

För att kontrollera vilket skal du använder, kör följande kommando:

 echo $SHELL 

Detta hjälper dig att bekräfta att du använder skalet du tänkt.

Skillnader mellan Zsh och Bash

Det finns flera skillnader mellan Zsh och Bash. Att ta hänsyn till dessa skillnader hjälper dig att bestämma vilket skal som passar dig bäst.

1. Snabb anpassning

Zsh erbjuder ett enklare sätt att anpassa dina meddelanden med hjälp av %-baserade escape-sekvenser. Detta möjliggör dynamiska uppmaningar med färg och information. För att anpassa din skalprompt, definiera PS1 (Primary Prompt).

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

Ovanstående anpassade prompt visar användarnamn, värdnamn och aktuell katalog i olika färger:

Det finns många andra sätt att anpassa Zsh-prompten, så att du kan ställa in en administratörsindikator, inkludera datum och tid och spara den nya prompten.

Bash använder ett lite annorlunda tillvägagångssätt när det kommer till snabb anpassning. Den använder escape-koder för att ange färg- och formatändringar i prompten. För att uppnå samma anpassning som Zsh ovan kan du använda följande anpassade prompt.

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

Använder sig av \[\033[0m\] är avgörande eftersom det säkerställer att färgändringarna inte påverkar text som följer uppmaningen.

2. Stöd för associativa arrayer

Zsh stöder naturligt associativa arrayer. Dessa arrayer ger ett bekvämt sätt att associera data som gör det enkelt att organisera och hämta information. Använd declare -A kommando för att explicit deklarera en associativ array:

 # Declare an associative array in Zsh 
declare -A my_assoc_array

Du kan sedan tilldela värden till den associativa arrayen:

 my_assoc_array=(key1 value1 key2 value2)  

Och slutligen, komma åt värdena med hjälp av deras nycklar:

 echo $my_assoc_array[key1] # Outputs: value1 

Bash har inkluderat inbyggt stöd för associativa arrayer sedan version 4.0. Du deklarerar och tilldelar värden på samma sätt som du skulle göra i Zsh. Men när det gäller att komma åt matrisvärden måste du linda nyckeln inom krulliga parenteser:

 echo "${my_assoc_array[key1]}"  

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

I tidigare versioner av Bash måste du hitta ett sätt att komma runt eller ha externa verktyg för att använda associativa arrayer.

3. Extended Globbing Patterns

Utökade globbing-mönster ger ett kraftfullt och flexibelt sätt att välja och manipulera filer och kataloger baserat på olika kriterier. De är användbara när du arbetar med komplexa filstrukturer eller när du behöver exakt kontroll över filval.

I ett Zsh-skript kan du aktivera dessa mönster med kommandot setopt. Till exempel, för att matcha alla .txt-filer i den aktuella katalogen:

 setopt extended_glob
txt_files=(*.txt)

Så här matchar du alla filer utom de med tillägget .log:

 setopt extended_glob
non_log_files=^(*.log)

I Bash måste du aktivera dem med kommandot shopt med alternativet extglob. Till exempel, för att matcha alla .txt-filer i den aktuella katalogen:

 shopt -s extglob
txt_files=(*.txt)

Så här matchar du alla filer utom de med tillägget .log:

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

Den största skillnaden mellan Zsh och Bash när det kommer till globbingmönster är kommandot som används för att aktivera dem. Observera dock att vissa operatörer är olika mellan de två skalen.

4. Avancerad parameterexpansion

Zsh stöder indirekt expansion av parametrar. Detta gör att du kan utöka värdet på en variabel vars namn är lagrat i en annan variabel. För att uppnå detta måste du prefixa variabelnamnet med ett utropstecken !.

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

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

 name="world"
var="name"
echo ${!var} # This will output: world

Likheter mellan Bash och Zsh

Även om det finns skillnader mellan Bash och Zsh, delar de också vissa likheter.

1. Kommandoradssyntax

Bash och Zsh delar en liknande kommandoradssyntax. Detta är bra eftersom det betyder att de flesta kommandon och skript du skriver kommer att fungera i båda skalen, utan ändringar. Zsh är byggt ovanpå Bash, så det innehåller alla samma grundläggande kommandon och funktioner.

Det finns dock mycket små skillnader i syntax som du måste identifiera och justera.

2. Kommandosubstitutionskonsistens

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

 result=$(ls)  

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

3. Alternativ för skriptfelsökning

Både Bash och Zsh använder -x-flagga för skriptfelsökning. När du kör ett skript med den här flaggan visar det varje kommando innan det körs. Detta hjälper dig att identifiera problem i dina skript.

 # Debugging a script in both Bash and Zsh
#!/bin/bash -x

echo "Debugging Bash script"

I det här Bash-skriptet möjliggör -x-flaggan felsökning. Du kan använda ett liknande tillvägagångssätt i Zsh; ersätt bara bash med zsh.

Överväganden för att välja mellan Zsh och Bash

  • Kompatibilitet och portabilitet: Bash är standardskalet på många Unix-baserade system. Detta gör det till ett säkrare val för skript för flera plattformar. Om du behöver att dina skript ska köras på ett brett utbud av system utan modifiering är Bash ett bättre alternativ.
  • Skriptkomplexitet och avancerade funktioner: Zsh tillhandahåller avancerade funktioner som associativa arrayer, utökade globbingmönster och avancerad parameterexpansion. Detta förenklar komplexa skriptuppgifter. Om dina skript kräver avancerad strängmanipulation eller datastrukturer är Zsh ett bättre val.
  • Gemenskaps- och plugin-ekosystem: Både Bash och Zsh har aktiva gemenskaper, men Zsh har en starkare gemenskap och ett omfattande ekosystem av plugins och teman. Om du värdesätter anpassning kan Zshs livliga community och plugin-stöd vara en betydande fördel.
  • Lätt att lära sig: Om du är ny med skalskript är Bash en mer tillgänglig utgångspunkt. Den har omfattande dokumentation och resurser tillgängliga för nybörjare. Detta gör det lättare att lära sig grunderna i skalskript.

Automatisera uppgifter med hjälp av skalskript

Att veta hur man automatiserar uppgifter med hjälp av skalskript är av stor vikt. Du kan automatisera repetitiva uppgifter och spara mycket tid.

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