Zsh vs. Bash-skripting. Hva er forskjellen?

Når det kommer til shell-scripting på Unix-lignende operativsystemer, dominerer to skall: Bash (Bourne Again Shell) og Zsh (Z Shell). Hvis du er programmerer eller systemadministrator, vil valget mellom disse to ha stor innvirkning på effektiviteten og produktiviteten din.

Å forstå forskjellene og likhetene mellom disse to skallene vil hjelpe deg med å optimalisere kommandolinjearbeidsflyten. Å vite om nyansene til hvert skall vil hjelpe deg med å ta informerte beslutninger.

Hva er Bash og Zsh?

Bash er populær på både Linux- og macOS-systemer. Det er et kraftig verktøy som du kan bruke til å samhandle med operativsystemet og kjøre kommandoer. Du kan også bruke Bash for shell scripting, som automatiserer oppgaver ved å skrive skript som inneholder mer enn én kommando.

Zsh (Z shell) er en utvidet versjon av Bash som har mange flere funksjoner. Det er standard skall på macOS. Det blir også stadig mer populært på Linux-systemer.

Hvordan bytte fra Bash til Zsh

Hvis du bruker et Linux-system og ønsker å bytte til Zsh, start med å bruke pakkebehandlingen for å installere den. For eksempel, på Debian eller Ubuntu, bruk følgende kommando:

 sudo apt install zsh 

Etter å ha installert det på systemet ditt, bytt til det ved å kjøre følgende kommando:

 chsh -s $(which zsh) 

Hvis du bruker macOS, er Zsh allerede installert. For å bytte til det, kjør følgende kommando:

 chsh -s /bin/zsh 

For å bytte tilbake til Bash, erstatt Zsh med Bash i kommandoene ovenfor.

For å sjekke hvilket skall du bruker, kjør følgende kommando:

 echo $SHELL 

Dette vil hjelpe deg å bekrefte at du bruker skallet du hadde tenkt å.

  Hva er Canuckle? Hvordan spille kanadisk Wordle-versjon

Forskjeller mellom Zsh og Bash

Det er flere forskjeller mellom Zsh og Bash. Å vurdere disse forskjellene vil hjelpe deg med å avgjøre hvilket skall som passer best for deg.

1. Spør tilpasning

Zsh tilbyr en enklere måte å tilpasse forespørslene dine ved å bruke %-baserte escape-sekvenser. Dette gir mulighet for dynamiske spørsmål med farger og informasjon. For å tilpasse shell-forespørselen din, definer PS1 (Primary Prompt).

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

Den egendefinerte ledeteksten ovenfor viser brukernavnet, vertsnavnet og gjeldende katalog i forskjellige farger:

Det er mange andre måter å tilpasse Zsh-ledeteksten på, slik at du kan angi en admin-indikator, inkludere dato og klokkeslett og lagre den nye ledeteksten.

Bash bruker en litt annen tilnærming når det kommer til rask tilpasning. Den bruker escape-koder for å spesifisere farge- og formateringsendringer i ledeteksten. For å oppnå samme tilpasning som Zsh ovenfor, kan du bruke følgende egendefinerte ledetekst.

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

Ved hjelp av \[\033[0m\] er avgjørende siden det sikrer at fargeendringene ikke påvirker teksten som følger ledeteksten.

2. Støtte for assosiative arrays

Zsh støtter naturlig assosiative arrays. Disse matrisene gir en praktisk måte å knytte data på, som gjør det enkelt å organisere og hente informasjon. Bruk declare -A kommando for å eksplisitt deklarere en assosiativ matrise:

 # Declare an associative array in Zsh 
declare -A my_assoc_array

Du kan deretter tilordne verdier til den assosiative matrisen:

 my_assoc_array=(key1 value1 key2 value2)  

Og til slutt, få tilgang til verdiene ved å bruke nøklene deres:

 echo $my_assoc_array[key1] # Outputs: value1 

Bash har inkludert innfødt støtte for assosiative arrays siden versjon 4.0. Du erklærer og tildeler verdier på samme måte som du ville gjort i Zsh. Men når det gjelder tilgang til matriseverdier, må du pakke nøkkelen inn i krøllede parenteser:

 echo "${my_assoc_array[key1]}"  

Hovedforskjellen er at Zshs støtte for assosiative arrays er mer funksjonsrik og avansert enn Bash. Zsh lar assosiative matriser ha nøkler av forskjellige datatyper, ikke bare strenger. Bash støtter kun strengtaster.

  7 beste AngularJS-rammeverk for rask applikasjonsutvikling

I tidligere versjoner av Bash må du finne en måte å omgå på eller ha eksterne verktøy for å bruke assosiative arrays.

3. Utvidede globbing mønstre

Utvidede globbing-mønstre gir en kraftig og fleksibel måte å velge og manipulere filer og kataloger på basert på ulike kriterier. De er nyttige når du jobber med komplekse filstrukturer eller når du trenger presis kontroll over filvalg.

I et Zsh-skript kan du aktivere disse mønstrene ved å bruke setopt-kommandoen. For eksempel, for å matche alle .txt-filer i gjeldende katalog:

 setopt extended_glob
txt_files=(*.txt)

Slik matcher du alle filer unntatt de med .log-utvidelsen:

 setopt extended_glob
non_log_files=^(*.log)

I Bash må du aktivere dem ved å bruke shopt-kommandoen med extglob-alternativet. For eksempel, for å matche alle .txt-filer i gjeldende katalog:

 shopt -s extglob
txt_files=(*.txt)

Slik matcher du alle filer unntatt de med .log-utvidelsen:

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

Hovedforskjellen mellom Zsh og Bash når det kommer til globbing-mønstre er kommandoen som brukes for å aktivere dem. Vær imidlertid oppmerksom på at noen operatører er forskjellige mellom de to skallene.

4. Avansert parameterutvidelse

Zsh støtter indirekte utvidelse av parametere. Dette lar deg utvide verdien til en variabel hvis navn er lagret i en annen variabel. For å oppnå dette må du prefiksere variabelnavnet med et utropstegn!.

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

Bash på den annen side tillater ikke indirekte utvidelse innfødt. Løsningen for dette er å bruke den innebygde eval-kommandoen eller ${!var}-syntaksen for indirekte variabelreferanser.

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

Likheter mellom Bash og Zsh

Selv om det er forskjeller mellom Bash og Zsh, deler de også noen likheter.

1. Kommandolinjesyntaks

Bash og Zsh deler en lignende kommandolinjesyntaks. Dette er flott fordi det betyr at de fleste kommandoer og skript du skriver vil fungere i begge skallene, uten endringer. Zsh er bygget på toppen av Bash, så den inkluderer alle de samme grunnleggende kommandoene og funksjonene.

  Hvordan fjerner jeg betalingsmåten fra DoorDash-kontoen

Det er imidlertid svært små forskjeller i syntaks som du må identifisere og justere.

2. Kommandoerstatningskonsistens

Kommandoerstatning er prosessen med å bygge inn utdataene fra en kommando i en annen. Det er konsistent mellom begge skjellene.

 result=$(ls)  

I både Bash og Zsh kan du bruke $(kommando)-syntaksen for å erstatte utdataene fra en kommando med en variabel. Dette muliggjør enkel portabilitet av skript mellom de to skallene.

3. Skriptfeilsøkingsalternativ

Både Bash og Zsh bruker -x-flagg for skriptfeilsøking. Når du kjører et skript med dette flagget, viser det hver kommando før den kjøres. Dette hjelper deg med å identifisere problemer i skriptene dine.

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

echo "Debugging Bash script"

I dette Bash-skriptet muliggjør -x-flagget feilsøking. Du kan bruke en lignende tilnærming i Zsh; bare bytt ut bash med zsh.

Betraktninger for å velge mellom Zsh og Bash

  • Kompatibilitet og portabilitet: Bash er standardskallet på 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å et bredt spekter av systemer uten modifikasjoner, er Bash et bedre alternativ.
  • Skriptkompleksitet og avanserte funksjoner: Zsh gir avanserte funksjoner som assosiative arrays, 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.
  • Enkel læring: Hvis du er ny på shell-skripting, er Bash et mer tilgjengelig utgangspunkt. Den har omfattende dokumentasjon og ressurser tilgjengelig for nybegynnere. Dette gjør det lettere å lære det grunnleggende om shell-scripting.

Automatisering av oppgaver ved hjelp av Shell-skript

Å vite hvordan man automatiserer oppgaver ved hjelp av shell-skript er av stor betydning. Du kan automatisere repeterende oppgaver og spare mye tid.

Du kan også bruke disse skriptene til å administrere brukerkontoer, overvåke systemressurser, sikkerhetskopiere data og utføre rutinemessig vedlikehold. Når de er nøye skrevet, kan de også redusere potensialet for menneskelige feil.