Når man arbeider med skallskripting i Unix-lignende operativsystemer, er Bash (Bourne Again Shell) og Zsh (Z Shell) de to mest fremtredende alternativene. Valget mellom disse to har en betydelig innvirkning på hvor effektivt og produktivt en programmerer eller systemadministrator arbeider.
For å optimalisere din arbeidsflyt i kommandolinjen er det viktig å forstå både likhetene og forskjellene mellom disse to skallene. Kunnskap om de unike egenskapene til hvert skall vil gjøre deg i stand til å ta velinformerte beslutninger.
Hva er Bash og Zsh?
Bash er et populært verktøy som benyttes både i Linux- og macOS-systemer. Det er et kraftfullt redskap for interaksjon med operativsystemet og kjøring av kommandoer. I tillegg brukes Bash til skallskripting, som automatiserer prosesser ved å lage skript bestående av flere kommandoer.
Zsh (Z shell) er en videreutviklet utgave av Bash, med et betydelig større utvalg av funksjoner. Det er standardskallet i macOS og blir stadig mer populært også i Linux-systemer.
Hvordan bytte fra Bash til Zsh
Dersom du bruker et Linux-system og ønsker å gå over til Zsh, starter du med å installere det ved hjelp av pakkebehandleren. For eksempel, i Debian eller Ubuntu, kan du bruke denne kommandoen:
sudo apt install zsh
Etter installasjonen bytter du til Zsh ved å kjøre følgende kommando:
chsh -s $(which zsh)
Om du bruker macOS, er Zsh allerede installert. For å ta det i bruk, kjører du denne kommandoen:
chsh -s /bin/zsh
For å bytte tilbake til Bash, erstatter du Zsh med Bash i kommandoene ovenfor.
Du kan kontrollere hvilket skall du bruker ved å kjøre denne kommandoen:
echo $SHELL
Dette bekrefter at du bruker det skallet du har til hensikt å bruke.
Forskjeller mellom Zsh og Bash
Det finnes flere distinkte forskjeller mellom Zsh og Bash. Å kjenne til disse forskjellene vil hjelpe deg med å bestemme hvilket skall som passer best for dine behov.
1. Ledeteksttilpasning
Zsh tilbyr enklere måter for tilpasning av ledeteksten ved hjelp av %-baserte sekvenser. Dette muliggjør dynamiske ledetekster med farger og annen informasjon. For å tilpasse ledeteksten definerer du PS1 (Primary Prompt).
PS1="%F{green}%n@%m %F{blue}%~ %f$ "
Den tilpassede ledeteksten ovenfor viser brukernavnet, vertsnavnet og gjeldende mappe i forskjellige farger:
Det finnes mange andre måter å tilpasse Zsh-ledeteksten på. Du kan for eksempel inkludere en admin-indikator, legge til dato og klokkeslett, og lagre den nye ledeteksten.
Bash bruker en litt annen metode for tilpasning av ledeteksten. Den benytter escape-koder for å spesifisere farge- og formateringsendringer i ledeteksten. For å oppnå samme tilpasning som Zsh ovenfor, kan du bruke følgende tilpassede ledetekst.
PS1="\[\033[32m\]\u@\h \[\033[34m\]\w \[\033[0m\]\$ "
Bruk av \[\033[0m\] er viktig da det sikrer at fargeendringene ikke påvirker teksten som kommer etter ledeteksten.
2. Støtte for assosiative matriser
Zsh har innebygd støtte for assosiative matriser, som gir en praktisk metode for å knytte data sammen, noe som forenkler organisering og henting av informasjon. Kommandoen declare -A
brukes for å eksplisitt deklarere en assosiativ matrise:
# Deklarer en assosiativ matrise i Zsh
declare -A my_assoc_array
Deretter kan du tildele verdier til den assosiative matrisen:
my_assoc_array=(key1 value1 key2 value2)
Og til slutt får du tilgang til verdiene ved å bruke nøklene deres:
echo $my_assoc_array[key1] # Utdata: value1
Bash har hatt innebygd støtte for assosiative matriser siden versjon 4.0. Du kan erklære og tildele verdier på samme måte som i Zsh. Men når det gjelder tilgang til matriseverdier, må du plassere nøkkelen inni krøllete parenteser:
echo "${my_assoc_array[key1]}"
Den største forskjellen er at Zshs støtte for assosiative matriser er mer funksjonsrik og avansert enn den i Bash. Zsh tillater assosiative matriser med nøkler av ulike datatyper, ikke bare strenger. Bash støtter kun strengnøkler.
I tidligere versjoner av Bash måtte man bruke alternative løsninger eller eksterne verktøy for å benytte seg av assosiative matriser.
3. Utvidede globbing-mønstre
Utvidede globbing-mønstre gir en kraftfull og fleksibel måte å velge og manipulere filer og mapper på, basert på diverse kriterier. Dette er nyttig når du arbeider med komplekse filstrukturer, eller når du trenger presis kontroll over filvalget.
I et Zsh-skript kan du aktivere disse mønstrene med kommandoen setopt
. For eksempel, for å matche alle .txt-filer i gjeldende mappe:
setopt extended_glob
txt_files=(*.txt)
Slik matcher du alle filer unntatt de med .log-endelsen:
setopt extended_glob
non_log_files=^(*.log)
I Bash aktiveres de ved å bruke kommandoen shopt
med alternativet extglob
. For å matche alle .txt-filer i gjeldende mappe, bruk:
shopt -s extglob
txt_files=(*.txt)
For å matche alle filer unntatt de med .log-endelsen:
shopt -s extglob
non_log_files=!(*.log)
Hovedforskjellen mellom Zsh og Bash når det gjelder globbing-mønstre, er kommandoen som brukes for å aktivere dem. Vær oppmerksom på at noen operatorer også er ulike mellom de to skallene.
4. Avansert parameterutvidelse
Zsh har støtte for indirekte utvidelse av parametere. Dette lar deg utvide verdien til en variabel der navnet er lagret i en annen variabel. For å gjøre dette, må du sette variabelnavnet i anførselstegn og deretter prefikse det med et utropstegn !
.
name="foo"
result="${!name}"
echo "$result"
Bash, derimot, har ikke innebygd støtte for indirekte utvidelse. En mulig løsning er å bruke den innebygde kommandoen eval
eller ${!var}
-syntaksen for indirekte variabelreferanser.
name="world"
var="name"
echo ${!var} # Dette vil utgi: world
Likheter mellom Bash og Zsh
Til tross for forskjellene mellom Bash og Zsh, deler de også noen likhetstrekk.
1. Kommandolinjesyntaks
Bash og Zsh deler en lignende kommandolinjesyntaks. Dette er en fordel fordi det betyr at de fleste kommandoer og skript du skriver vil fungere i begge skallene uten endringer. Zsh er bygget oppå Bash, så den inneholder alle de samme grunnleggende kommandoene og funksjonene.
Det finnes imidlertid noen svært små syntaksforskjeller som det kan være nødvendig å identifisere og justere.
2. Konsistent kommandoerstatning
Kommandoerstatning er prosessen der utdata fra en kommando legges inn i en annen. Dette er konsistent mellom begge skallene.
result=$(ls)
I både Bash og Zsh kan du bruke $(kommando)
-syntaksen for å erstatte utdata fra en kommando med en variabel. Dette gjør det enkelt å overføre skript mellom de to skallene.
3. Skriptfeilsøkingsalternativ
Både Bash og Zsh bruker -x
-flagget for feilsøking av skript. Når du kjører et skript med dette flagget, vises hver kommando før den kjøres. Dette hjelper deg med å identifisere problemer i skriptene dine.
# Feilsøking av et skript i både Bash og Zsh
#!/bin/bash -xecho "Feilsøker Bash-skript"
I dette Bash-skriptet gjør -x
-flagget feilsøking mulig. Du kan bruke en lignende tilnærming i Zsh; bare erstatt bash
med zsh
.
Betraktninger for valg mellom Zsh og Bash
- Kompatibilitet og portabilitet: Bash er standardskallet i mange Unix-baserte systemer. Dette gjør det til et tryggere valg for skripting på tvers av plattformer. Hvis du trenger at skriptene dine skal kjøre på mange ulike systemer uten endringer, er Bash et bedre alternativ.
- Skriptkompleksitet og avanserte funksjoner: Zsh tilbyr avanserte funksjoner som assosiative matriser, utvidede globbing-mønstre og avansert parameterutvidelse. Dette forenkler komplekse skriptoppgaver. Hvis skriptene dine krever avansert strengmanipulering eller datastrukturer, er Zsh et bedre valg.
- Fellesskap og plugin-økosystem: Både Bash og Zsh har aktive fellesskap, men Zsh har et sterkere fellesskap og et omfattende økosystem av plugins og temaer. Hvis du verdsetter tilpasning, kan Zshs livlige fellesskap og plugin-støtte være en betydelig fordel.
- Enkelt å lære: Hvis du er nybegynner innen skallskripting, er Bash et mer tilgjengelig utgangspunkt. Det finnes mye dokumentasjon og ressurser tilgjengelig for nybegynnere, noe som gjør det enklere å lære det grunnleggende om skallskripting.
Automatisering av oppgaver ved hjelp av skallskript
Det er svært viktig å kunne automatisere oppgaver ved hjelp av skallskript. Du kan automatisere repeterende prosesser og spare mye tid.
Du kan også bruke disse skriptene til å administrere brukerkontoer, overvåke systemressurser, ta sikkerhetskopi av data og utføre rutinemessig vedlikehold. Når de er nøye skrevet, kan de også redusere potensialet for menneskelige feil.