Förflyttning till zsh

nov 28, 2021
admin

Apple har meddelat att i macOS 10.15 Catalina kommer standardskalet att vara zsh.

I den här serien kommer jag att dokumentera mina erfarenheter av att flytta bash inställningar, konfigurationer och skript över till zsh.

  • Del 1: Flytt till zsh (den här artikeln)
  • Del 2: Konfigurationsfiler
  • Del 3: Skalalternativ
  • Del 4: Alias och funktioner
  • Del 5: Kompletteringar
  • Del 6: Anpassning av zsh-prompten
  • Del 7: Diverse
  • Del 8: Scripting zsh

zsh (jag tror att det uttalas zee-shell, även om zish är roligt att säga) kommer att efterträda bash som standardskal. bash har varit standardskalet sedan Mac OS X 10.3 Panther.

Denna serie har vuxit till en bok: omarbetad och utökad med fler detaljer och ämnen. Liksom mina andra böcker planerar jag att uppdatera och lägga till den även efter utgivningen för att hålla den relevant och användbar. Du kan beställa den på Apple Books Store nu.

Varför?

Den binära bash som levereras med macOS har fastnat på version 3.2 under lång tid nu. bash v4 släpptes 2009 och bash v5 i januari 2019. Anledningen till att Apple inte har bytt till dessa nyare versioner är att de är licensierade med GPL v3. bash v3 är fortfarande GPL v2.

zsh har å andra sidan en ”MIT-liknande” licens, vilket gör den mycket mer smaklig för Apple att inkludera i systemet som standard. zsh har funnits tillgänglig som på macOS under lång tid. zsh-versionen på macOS 10.14 Mojave är ganska ny (5.3). macOS 10.15 Catalina har den nuvarande zsh 5.7.1.

Is bash gone!?

No.

macOS Catalina har fortfarande samma /bin/bash (version 3.2.57) som Mojave och tidigare macOS-versioner. Den här ändringen gäller endast för nya konton som skapas på macOS Catalina. När du uppgraderar till Catalina förblir en användares standardskal som tidigare.

Många skript i macOS, hanteringssystem och installationsprogram från Apple och tredje part förlitar sig på /bin/bash. Om Apple bara slängde den här binären i macOS 10.15 Catalina eller till och med 10.16. Många installationsprogram och andra lösningar skulle gå sönder och helt enkelt upphöra att fungera.

Användare som har /bin/bash som standardskal på Catalina kommer att se en uppmaning i början av varje Terminalsession där det står att zsh nu är det rekommenderade standardskalet. Om du vill fortsätta att använda /bin/bash kan du förtränga detta meddelande genom att ställa in en miljövariabel i din .bash_profile eller .bashrc.

export BASH_SILENCE_DEPRECATION_WARNING=1

Du kan också ladda ner och installera en nyare version av bash själv. Tänk på att anpassade bash-installationer ligger i en annan katalog, vanligtvis /usr/local/bin/bash.

Var bash kvar på obestämd tid?

Apple meddelar starkt att du bör byta skal. Detta skiljer sig från det senaste bytet i Mac OS X 10.3 Panther, då Apple bytte standard till bash, men inte riktigt brydde sig om du stannade kvar på tcsh. Faktum är att tcsh fortfarande finns kvar i macOS.

Apples meddelanden borde tala om för oss att /bin/bashs dagar är räknade. Förmodligen inte så snart, men så småningom kommer det att bli en belastning att ha en mer än tio år gammal version av bash i systemet. Den inbyggda bash måste patchas 2014 för att mildra sårbarheten ”Shellshock”. Någon gång kommer Apple att anse att kostnaden för fortsatt underhåll är för hög.

En annan ledtråd är att ett nytt skal dök upp i macOS Catalina (och nämns i supportartikeln). ”Debian Almquist Shell” dash har lagts till bland skalen. dash är utformad för att vara en minimal implementering av Posix standard shell sh. Hittills, i macOS (inklusive Catalina), åberopar sh bash i sh-kompatibilitetsläge.

Som Apples supportartikel nämner, lägger Catalina också till en ny mekanism för användare och administratörer att ändra vilket skal som hanterar sh-anrop. MacAdmins eller användare kan ändra den symboliska länken som lagras i /var/select/sh så att den pekar på ett annat skal än /bin/bash. Detta ändrar vilket skal som tolkar skript #!/bin/sh shebang eller skript som anropas med sh -c. Att ändra tolkaren för sh bör inte, men kan ändra beteendet hos flera viktiga skript i systemet, förvaltningsverktyg och i installationsprogram, men kan vara mycket användbart i testsyfte.

Alla dessa förändringar är indikatorer på att Apple förbereder sig för att ta bort /bin/bash vid någon, ännu obestämd, tidpunkt i framtiden.

Behövs jag vänta på att Catalina ska byta till zsh?

Nej, zsh är tillgänglig Mojave och på äldre macOS-versioner. Du kan börja testa zsh eller till och med byta standardskal redan.

Om du bara vill se hur zsh fungerar kan du bara öppna Terminal och skriva zsh:

$ zshMacBook%

Den viktigaste förändringen du kommer att se är att prompten ser annorlunda ut. zsh använder tecknet % som standardprompt. (Du kan naturligtvis ändra det.) De flesta navigeringstangenter och andra beteenden kommer att förbli desamma som i bash.

Om du redan nu vill byta ditt standardskal till zsh kan du använda kommandot chsh:

$ chsh -s /bin/zsh

Detta kommer att fråga efter ditt lösenord. Detta kommando ändrar inte det nuvarande skalet, utan alla nya, så stäng de nuvarande terminalfönstren och flikarna och öppna ett nytt.

Hur skiljer sig zsh åt?

Likt bash (”Bourne again shell” ), härstammar zsh från ”Bourne”-familjen av skal. På grund av denna gemensamma härstamning beter den sig mycket likartat vid daglig användning. Den mest uppenbara förändringen kommer att vara den annorlunda prompten.

Den största skillnaden mellan bash och zsh är konfigurationen. Eftersom zsh ignorerar bashs konfigurationsfiler (.bash_profile eller .bashrc) kan du inte helt enkelt kopiera anpassade bash-inställningar över till zsh. zsh har mycket fler alternativ och punkter för att ändra zshs konfiguration och beteende. Det finns ett helt ekosystem av konfigurationsverktyg och teman som kallas oh-my-zsh och som är mycket populärt.

zsh erbjuder också bättre konfiguration för autokomplettering som är mycket enklare än i bash.

Jag planerar ett separat inlägg som beskriver hur du överför (och översätter) dina konfigurationer från bash till zsh.

Hur är det med skript?

Med tanke på att zsh har funnits länge i macOS kan du börja flytta dina skript från bash till zsh direkt utan att förlora bakåtkompatibilitet. Kom bara ihåg att ställa in shebang i dina skript till #!/bin/zsh.

Du kommer att få vissa funktioner där zsh är överlägsen bash v3, till exempel matriser och associativa matriser (ordböcker).

Det finns ett undantag där jag nu skulle rekommendera att du använder /bin/sh för dina skript: Recovery-systemet innehåller inte /bin/zsh-skalet, inte ens i Catalina-betan. Detta kan fortfarande ändras under betafasen, eller till och med senare, men då måste du fortfarande ta hänsyn till äldre macOS-installationer där zsh definitivt inte finns i Recovery.

När du planerar att använda dina skript eller pkgs med installationsskript i ett Recovery-sammanhang (eller NetInstall, eller startbar USB-enhet), såsom Twocanoes MDS, installr eller bootstrappr, så kan du inte förlita dig på /bin/zsh.

När vi nu vet att bash så småningom kommer att försvinna är det enda vanliga valet som återstår /bin/sh.

När du bygger ett installationspaket kan det vara svårt att förutse alla sammanhang där det kan användas. Så för skript för installation före och efter installation rekommenderar jag att man använder /bin/sh som shebang från och med nu.

Jag brukade rekommendera att man använde /bin/bash för allt som har med MacAdmin att göra. /bin/sh är definitivt ett steg ner i funktionalitet, men det verkar vara det säkraste valet för fortsatt support.

Sammanfattning

Samt sett är meddelandet från Apple mycket intressant, men själva förändringen är mindre dramatisk än rubrikerna. Apple ”ersätter” inte bash med zsh, åtminstone inte ännu. På det hela taget måste vi tänka om och lära oss några saker på nytt, men det finns också mycket att vinna på att äntligen byta från ett tio år gammalt skal till ett nytt modernt skal!

Nästa

I nästa del ska vi titta på konfigurationsfilerna för zsh.

Lämna ett svar

Din e-postadress kommer inte publiceras.