Flytning til zsh
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 bash
binæ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 zsh
s 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
.