Contents

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

När det gäller skalskript på Unix-liknande operativsystem finns det två skal som dominerar: Bash (Bourne Again Shell) och Zsh (Z Shell). Om du är programmerare eller systemadministratör har valet mellan dessa två stor betydelse för din effektivitet och produktivitet.

Att förstå skillnaderna och likheterna mellan dessa två skal kan vara en fördel när man vill optimera sin arbetsprocess på kommandoraden, eftersom kunskap om deras särskilda egenskaper gör det möjligt att göra välgrundade bedömningar.

Vad är Bash och Zsh?

Bash, ett mångsidigt och allmänt använt kommandoradsgränssnitt, erbjuder ett omfattande utbud av funktioner på olika plattformar som Linux- och macOS-system. Det är ett robust och effektivt verktyg som gör att användare kan interagera sömlöst med sina operativsystem och samtidigt utföra flera kommandon samtidigt. Dessutom sträcker sig Bashs kapacitet bortom grundläggande interaktioner genom dess stöd för skalskript. Genom att använda skript som består av flera kommandon kan användare effektivt automatisera repetitiva eller tidskrävande uppgifter och därigenom effektivisera arbetsflödesprocesser.

Zsh innehåller element från både Mac- och Linux-operativsystemen och är ett mångsidigt och funktionsrikt kommandoradsgränssnitt som fungerar som standardskal för Apples macOS-plattform samtidigt som det blir allt vanligare bland olika Linux-distributioner.

Hur man byter från Bash till Zsh

För att sömlöst övergå från att använda ett Linux-operativsystem till att anta Zsh som ditt standardskal, börja med att använda din distributions respektive pakethanterare för installationsändamål. Om du t.ex. arbetar med ett Debian- eller Ubuntu-baserat system utför du följande kommando:

 sudo apt install zsh 

När du har installerat programmet på din dator kan du enkelt börja använda det genom att utföra ett specifikt kommando i terminalen eller kommandotolken.

 chsh -s $(which zsh) 

För att övergå till Zsh-skalet på ett Mac-operativsystem, utför följande direktiv i din terminal:

 chsh -s /bin/zsh 

För att återgå till att använda Bash-skalet istället för Zsh, modifiera helt enkelt kommandona som angavs tidigare genom att ersätta “Zsh” med “Bash”.

Om du vill kontrollera vilket skal som används för tillfället utför du följande direktiv:

 echo $SHELL 

Att använda en bekräftande åtgärd kan hjälpa till att validera att användaren använder den önskade operativa miljön, vilket ger större säkerhet när det gäller det val som gjorts.

Skillnader mellan Zsh och Bash

Att undersöka skillnaderna mellan Zsh och Bash är viktigt för att avgöra vilken av dessa skal som passar dina preferenser och krav.

Anpassning av prompten

Zsh erbjuder en praktisk metod för att anpassa kommandoradsgränssnittet genom att använda procentbaserade escape-sekvenser i den primära prompten, som betecknas PS1. Genom att använda detta tillvägagångssätt är det möjligt att skapa visuellt tilltalande och informativa prompter som innehåller element som färg och dynamiskt genererat innehåll. För att kunna skräddarsy utseendet på skalprompten måste du först fastställa önskad konfiguration genom att definiera variabeln PS1.

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

Den ovan nämnda anpassade prompten visar användarens moniker, domännamn och aktuella arbetskatalog genom visuella indikatorer i olika färger:

/sv/images/what-is-the-difference-zsh-vs-bash-scripting-in-the-terminal-prompt-customization.jpg

Alternativt finns det en mängd metoder för att anpassa Zsh-prompten, så att man kan visa en administrativ indikation, införliva aktuellt datum och tid och bevara alla ändringar som gjorts i den uppdaterade prompten.

Bash använder en alternativ strategi för att anpassa prompten jämfört med Zsh. Användning av escape-koder möjliggör anpassning av färg och format inom prompten. För att uppnå en liknande nivå av anpassning som Zsh:s exempel kan man använda följande anpassade promptmall:

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

Att använda \\[\033[0m\\] är viktigt, eftersom det garanterar att eventuella ändringar av färgen inte kommer att påverka efterföljande text i kommandot eller meddelandet.

Stöd för associativa matriser

Zsh, som är ett inbyggt programmeringsspråk i Unix-liknande system, erkänner i sig konceptet med associativa matriser. Associativa matriser är i princip samlingar av nyckel-värdepar som underlättar organisering och hämtning av information med yttersta enkelhet. För att skapa en associativ matris kan man använda nyckelordet “declare” följt av “-A” för att uttryckligen deklarera dess existens.

 # Declare an associative array in Zsh
 declare -A my_assoc_array 

Därefter kan man förse den associativa matrisen med tilldelade värden.

 my_assoc_array=(key1 value1 key2 value2)

För att hämta de värden som är associerade med en ordboks nycklar kan man använda indexering för att direkt referera till och komma åt dessa värden. Denna process innebär att man anger den nyckel som är av intresse och använder den som ett index för att få fram motsvarande värde i lexikonet.

 echo $my_assoc_array[key1] # Outputs: value1 

Bash har inbyggt stöd för associativa matriser från och med version 4. Processen för att deklarera och tilldela värden liknar den i Zsh.När det gäller att hämta arrayelement måste man dock ange indexet inom skruvade hängslen, {}.

 echo "${my_assoc_array[key1]}"

En anmärkningsvärd skillnad mellan Zsh och Bash ligger i deras respektive kapacitet när det gäller associativa matriser. Även om båda shells erbjuder sådan funktionalitet, erbjuder Zsh en mer omfattande uppsättning funktioner för dessa datastrukturer. Zsh tillåter associativa matriser med nyckelvärden av olika datatyper utöver textsträngar, medan Bash begränsar sina nycklar till att enbart bestå av strängelement.

I tidigare versioner av programmeringsspråket Bash krävdes det lösningar eller externa verktyg för att använda associativa matriser.

Utökade globmönster

Utökade globmönster är en robust och mångsidig metod för att välja och manipulera filer och kataloger enligt flera kriterier, vilket gör dem särskilt användbara i situationer med komplicerade katalogstrukturer eller krävande nivåer av granularitet i filvalet.

För att aktivera specifika kriterier för mönstermatchning i ett Zsh-skript med kommandot setopt , kan man ange en viss filändelse av intresse för den aktuella arbetskatalogen. För att uppnå detta mål, kör helt enkelt kommandot setopt följt av det önskade filtillägget, t.ex. .txt , vilket möjliggör igenkänning och bearbetning av textfiler med detta suffix inom den aktuella katalogkontexten.

 setopt extended_glob
txt_files=(*.txt)

" .jpg\ -not *.log". Detta kommer att välja alla filer som har filändelsen “.jpg” eller “.jpeg” och som inte har en matchande “.log” -ändelse.

 setopt extended_glob
non_log_files=^(*.log)

För att kunna använda utökade globbing-mönster i Bash-skalet måste man aktivera den här funktionen genom att använda kommandot “shopt” tillsammans med alternativet “extglob”. Om man t.ex. vill identifiera och bearbeta alla filer som slutar på “.txt” och som finns i den aktuella arbetskatalogen, skriver man in följande kod:

 shopt -s extglob
txt_files=(*.txt)

För att utesluta filer med filändelsen “.log” från att matchas kan du använda följande mönster för reguljära uttryck i kommandot grep:css[^. ]\*\.log$Detta söker efter alla strängar som inte börjar med en punkt (dvs. det är inte ett filnamn som slutar på “.log”), följt av “\.log”. Detta matchar alla delsträngar av tecken som slutar med “.log”, vilket bör inkludera de flesta loggfiler men utesluta andra typer av textfiler eller kataloger.

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

När det gäller matchning av globmönster finns det en viktig skillnad mellan Zsh och Bash i förhållande till de kommandon som används för att aktivera dessa mönster. Det bör dock noteras att vissa operatörer som används av respektive skal kan variera.

Avancerad parameterexpansion

Zsh erbjuder möjligheten till indirekt parameterexpansion, vilket möjliggör utvärdering av en variabel vars namn ingår i en annan variabel. För att utföra denna operation är det nödvändigt att föregå variabelns namn med ett utropstecken, som betecknas med “!”.

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

Bash har inget inbyggt stöd för indirekta variabelexpansioner. Det finns dock lösningar som att använda det inbyggda kommandot eval eller använda syntaxen ${!variable} för att uppnå indirekt referens av variabler.

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

Likheter mellan Bash och Zsh

Trots de skillnader som finns mellan Bash och Zsh kan man också se vissa gemensamma nämnare mellan dem.

Kommandoradssyntax

Bash och Zsh använder en analog struktur för sina kommandoradsgränssnitt, vilket underlättar sömlös interoperabilitet mellan dem. Följaktligen kan de flesta direktiv och skriptsekvenser utföras i båda skalen utan behov av justeringar. Det faktum att Zsh är byggt på grunden av Bash innebär att det innehåller alla grundläggande förmågor och funktioner.

Även om det kan finnas några små avvikelser i grammatisk struktur som kräver uppmärksamhet, är det viktigt att noggrant överväga och åtgärda dem i enlighet därmed.

Kommandosubstitution Konsistens

Kommandosubstitution är en teknik som används för att utföra kommandon där resultatet eller utdata från ett kommando införlivas som ett argument i ett annat kommando, vilket säkerställer enhetlighet i olika skalmiljöer.

 result=$(ls)

Både Bash och Zsh tillhandahåller en liknande funktion genom att tillåta användning av syntaxen $(command), som möjliggör substitution av utdata från ett kommando till en variabel. Denna funktion underlättar sömlös interoperabilitet mellan de två skaltyperna samtidigt som skriptkompatibiliteten bibehålls på olika plattformar.

Alternativ för felsökning av skript

Både Bash och Zsh använder flaggan -x för att underlätta felsökning av skript. Om du kör ett skript med den här flaggan visas varje kommando innan det körs. Detta gör det möjligt för användare att upptäcka eventuella avvikelser i sina skript.

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

echo "Debugging Bash script"

Användningen av flaggan -x i detta Bash-skript tjänar till att underlätta felsökning. Denna funktionalitet kan också replikeras i ett Zsh-sammanhang genom att ersätta bash med zsh , och därmed införliva dess fördelar i den senare skalmiljön.

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

Bashs förekomst som standardskal på många Unix-baserade plattformar ger det en högre grad av kompatibilitet och transportabilitet, vilket gör det till ett säkrare val för skriptning i flera system som kräver minimala ändringar i olika maskinvaruarkitekturer.

Zsh erbjuder en rad sofistikerade funktioner som associativa matriser, förbättrade globmönster och intrikata parameterexpansionsalternativ som förenklar skriptprocesser på hög nivå. Dessa attribut är särskilt fördelaktiga för dem som kräver överlägsen strängbearbetning och strukturell komplexitet i sina skript.

Bash- och Zsh-shells har båda blomstrande communitys, men det senare har ett mer robust community och ett omfattande utbud av plugins och teman att välja mellan. För de som prioriterar personlig anpassning kan detta vara en betydande fördel för Zsh.

Bash, som är ett intuitivt och allmänt använt skal, fungerar som en lättillgänglig ingång för dem som inte är bekanta med skalskript. Dess omfattande dokumentation och nybörjarorienterade material förenklar processen att förstå grundläggande begrepp inom detta område.

Automatisera uppgifter med hjälp av skalskript

Att använda skriptspråk för att effektivisera processer genom att implementera skalskript har ett stort värde. Genom att mekanisera återkommande uppgifter kan mycket tid sparas.

Förutom att hantera användarkonton, övervaka systemresurser, säkerhetskopiera data och utföra rutinunderhåll kan dessa skript användas för att minimera sannolikheten för mänskligt överseende.