Flytning til zsh

nov 28, 2021
admin

Apple har annonceret, at standardskal i macOS 10.15 Catalina vil være zsh.

I denne serie vil jeg dokumentere mine erfaringer med at flytte bash indstillinger, konfigurationer og scripts over til zsh.

  • Del 1: Flytning til zsh (denne artikel)
  • Del 2: Konfigurationsfiler
  • Del 3: Shellindstillinger
  • Del 4: Aliaser og funktioner
  • Del 5: Afslutninger
  • Del 6: Tilpasning af zsh-prompt
  • Del 7: Diverse
  • Del 8: Scripting zsh

zsh (jeg tror det udtales zee-shell, selvom zish er sjovt at sige) vil afløse bash som standardskal. bash har været standardskal siden Mac OS X 10.3 Panther.

Denne serie er vokset til en bog: omarbejdet og udvidet med flere detaljer og emner. Ligesom mine andre bøger har jeg planer om at opdatere og tilføje til den også efter udgivelsen, så den forbliver relevant og nyttig. Du kan bestille den i Apple Books Store nu.

Hvorfor?

Den bashbinære fil, der er bundtet med macOS, har længe siddet fast på version 3.2. bash v4 blev udgivet i 2009 og bash v5 i januar 2019. Grunden til, at Apple ikke har skiftet til disse nyere versioner, er, at de er licenseret med GPL v3. bash v3 er stadig GPL v2.

zsh har derimod en “MIT-lignende” licens, hvilket gør det meget mere spiseligt for Apple at inkludere det i systemet som standard. zsh har været tilgængelig som på macOS i lang tid. zsh-versionen på macOS 10.14 Mojave er ret ny (5.3). macOS 10.15 Catalina har den nuværende zsh 5.7.1.

Er bash væk!?

Nej.

macOS Catalina har stadig den samme /bin/bash (version 3.2.57) som Mojave og tidligere macOS-versioner. Denne ændring er kun for nye konti oprettet på macOS Catalina. Når du opgraderer til Catalina, forbliver en brugers standardskal, som den var før.

Mange scripts i macOS, administrationssystemer og Apple- og tredjepartsinstallationsprogrammer er afhængige af /bin/bash. Hvis Apple bare har rykket denne binære fil i macOS 10.15 Catalina eller endda 10.16. ville mange installationsprogrammer og andre løsninger gå i stykker og simpelthen ophøre med at fungere.

Brugere, der har /bin/bash som deres standardskal på Catalina, vil se en prompt i starten af hver Terminalsession, der fortæller, at zsh nu er den anbefalede standardskal. Hvis du fortsat ønsker at bruge /bin/bash, kan du undertrykke denne meddelelse ved at indstille en miljøvariabel i din .bash_profile eller .bashrc.

export BASH_SILENCE_DEPRECATION_WARNING=1

Du kan også selv downloade og installere en nyere version af bash. Husk, at brugerdefinerede bash-installationer ligger i en anden mappe, normalt /usr/local/bin/bash.

Vil bash blive stående på ubestemt tid?

Apple giver kraftigt besked om, at du bør skifte shells. Dette er forskelligt fra det sidste skift i Mac OS X 10.3 Panther, hvor Apple skiftede standard til bash, men var egentlig ligeglad med, om du forblev på tcsh. Faktisk er tcsh stadig til stede på macOS.

Apples beskeder burde fortælle os, at dagene for /bin/bash er talte. Sandsynligvis ikke meget snart, men på et tidspunkt vil det blive en belastning at have en mere end ti år gammel version af bash på systemet. Den indbyggede bash måtte patches i 2014 for at afhjælpe sårbarheden “Shellshock”. På et tidspunkt vil Apple anse omkostningerne ved fortsat vedligeholdelse for høje.

Et andet fingerpeg er, at en ny shell dukkede op på macOS Catalina (og er nævnt i supportartiklen). ‘Debian Almquist Shell’ dash er blevet tilføjet til rækken af skaller. dash er designet til at være en minimal implementering af Posix-standardskallen sh. Hidtil har sh i macOS (herunder Catalina) påkaldt bash i sh-kompatibilitetstilstand.

Som Apples supportartikel nævner, tilføjer Catalina også en ny mekanisme for brugere og administratorer til at ændre, hvilken shell der håndterer sh-opkaldelser. MacAdmins eller brugere kan ændre det symbolske link, der er gemt i /var/select/sh, til at pege på en anden shell end /bin/bash. Dette ændrer hvilken shell der fortolker scripts #!/bin/sh shebang eller scripts, der er påkaldt med sh -c. Ændring af fortolkeren for sh bør ikke, men kan ændre opførslen af flere afgørende scripts i systemet, administrationsværktøjer og i installationsprogrammer, men kan være meget nyttig til testformål.

Alle disse ændringer er tegn på, at Apple forbereder sig på at fjerne /bin/bash på et endnu ubestemt tidspunkt i fremtiden.

Bør jeg vente på Catalina for at skifte til zsh?

Nej, zsh er tilgængelig Mojave og på ældre macOS-versioner. Du kan begynde at teste zsh eller endda skifte din standard shell allerede.

Hvis du bare vil se, hvordan zsh fungerer, kan du bare åbne Terminal og skrive zsh:

$ zshMacBook%

Den vigtigste ændring, du vil se, er, at prompten ser anderledes ud. zsh bruger %-tegnet som standardprompt. (Du kan selvfølgelig ændre det.) De fleste navigationstastetryk og anden adfærd forbliver de samme som i bash.

Hvis du allerede vil skifte din standard shell til zsh, kan du bruge kommandoen chsh:

$ chsh -s /bin/zsh

Dette vil bede om din adgangskode. Denne kommando ændrer ikke den nuværende shell, men alle nye, så luk de nuværende Terminal-vinduer og faner og åbn en ny.

Hvordan er zsh anderledes?

Lige bash (‘Bourne again shell’ ), stammer zsh fra ‘Bourne’-familien af shells. På grund af denne fælles afstamning opfører den sig meget ens i daglig brug. Den mest indlysende ændring vil være den anderledes prompt.

Den største forskel mellem bash og zsh er konfigurationen. Da zsh ignorerer bash-konfigurationsfilerne (.bash_profile eller .bashrc), kan du ikke blot kopiere tilpassede bash-indstillinger over til zsh. zsh har langt flere muligheder og punkter til at ændre zshs konfiguration og adfærd. Der findes et helt økosystem af konfigurationsværktøjer og temaer kaldet oh-my-zsh, som er meget populært.

zsh tilbyder også en bedre konfiguration til autokomplettering, som er langt nemmere end i bash.

Jeg planlægger et separat indlæg, der beskriver, hvordan du overfører (og oversætter) dine konfigurationer fra bash til zsh.

Hvad med scripting?

Da zsh har været til stede på macOS i lang tid, kan du begynde at flytte dine scripts fra bash til zsh med det samme og ikke miste bagudkompatibilitet. Du skal blot huske at sætte shebang i dine scripts til #!/bin/zsh.

Du vil få nogle funktioner, hvor zsh er bash v3 overlegen, f.eks. arrays og associative arrays (ordbøger).

Der er en undtagelse, hvor jeg nu vil anbefale at bruge /bin/sh til dine scripts: Recovery-systemet indeholder ikke /bin/zsh shell, selv ikke på Catalina beta. Dette kan stadig ændre sig i løbet af betafasen, eller endda senere, men så skal du stadig overveje ældre macOS-installationer, hvor zsh bestemt ikke er til stede i Recovery.

Når du planlægger at bruge dine scripts eller pkgs med installationsskripter i en Recovery-kontekst (eller NetInstall, eller bootbar USB-drev), såsom Twocanoes MDS, installr eller bootstrappr, så kan du ikke stole på /bin/zsh.

Da vi nu ved, at bash efterhånden forsvinder, er det eneste almindelige valg, der er tilbage, /bin/sh.

Når du laver en installationspakke, kan det være svært at forudse alle de kontekster, som den kan blive anvendt i. Så til installationsskripter før og efter installation vil jeg anbefale at bruge /bin/sh som shebang fremover.

Jeg plejede at anbefale at bruge /bin/bash til alt MacAdmin-relateret. /bin/sh er helt klart et skridt nedad i funktionalitet, men det virker som det sikreste valg for fortsat support.

Summary

Overordnet set er selve ændringen mindre dramatisk end overskrifterne, selv om beskederne fra Apple er meget interessante. Apple “udskifter” ikke bash med zsh, i hvert fald ikke endnu. Alt i alt bliver vi nødt til at gentænke og genlære nogle få ting, men der er også meget at vinde ved endelig at skifte fra en ti år gammel skal til en ny, moderne skal!

Næste

I næste del vil vi se på konfigurationsfilerne til zsh.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.