Verhuizen naar zsh
Apple heeft aangekondigd dat in macOS 10.15 Catalina de standaard shell zsh
.
In deze serie zal ik mijn ervaringen documenteren met het verplaatsen van bash
instellingen, configuraties, en scripts naar zsh
.
- Deel 1: Verhuizen naar zsh (dit artikel)
- Deel 2: Configuratie Bestanden
- Deel 3: Shell Opties
- Deel 4: Aliassen en Functies
- Deel 5: Aanvullingen
- Deel 6: Aanpassen van de
zsh
Prompt - Deel 7: Miscellanea
- Deel 8: Scripting
zsh
zsh
(ik geloof dat het wordt uitgesproken als zee-shell, hoewel zish leuk is om te zeggen) zal bash
opvolgen als de standaard shell. bash
is de standaard shell sinds Mac OS X 10.3 Panther.
Deze serie is uitgegroeid tot een boek: herwerkt en uitgebreid met meer details en onderwerpen. Net als mijn andere boeken ben ik van plan om het ook na de release bij te werken en aan te vullen, zodat het relevant en nuttig blijft. Je kunt het nu bestellen in de Apple Books Store.
Waarom?
De bash
binary die met macOS wordt gebundeld, is al lange tijd blijven steken op versie 3.2. bash
v4 werd uitgebracht in 2009 en bash
v5 in januari 2019. De reden dat Apple niet is overgestapt op deze nieuwere versies is dat ze zijn gelicentieerd met GPL v3. bash
v3 is nog steeds GPL v2.
zsh
heeft daarentegen een ‘MIT-achtige’ licentie, waardoor het voor Apple veel smakelijker is om standaard in het systeem op te nemen. zsh
is al lange tijd beschikbaar als op macOS. De zsh
versie op macOS 10.14 Mojave is vrij nieuw (5.3). macOS 10.15 Catalina heeft de huidige zsh
5.7.1.
Is bash verdwenen!?
Nee.
macOS Catalina heeft nog steeds dezelfde /bin/bash
(versie 3.2.57) als Mojave en eerdere macOS versies. Deze wijziging is alleen voor nieuwe accounts die zijn gemaakt op macOS Catalina. Wanneer u een upgrade naar Catalina uitvoert, zal de standaard shell van een gebruiker blijven wat het eerder was.
Vele scripts in macOS, beheersystemen, en installatieprogramma’s van Apple en derden vertrouwen op /bin/bash
. Als Apple deze binary gewoon zou weggooien in macOS 10.15 Catalina of zelfs 10.16. Veel installateurs en andere oplossingen zouden breken en simpelweg ophouden te functioneren.
Gebruikers die /bin/bash
als hun standaard shell hebben op Catalina zullen aan het begin van elke Terminal sessie een prompt zien die aangeeft dat zsh
nu de aanbevolen standaard shell is. Als u /bin/bash
wilt blijven gebruiken, kunt u deze boodschap onderdrukken door een omgevingsvariabele in te stellen in uw .bash_profile
of .bashrc
.
export BASH_SILENCE_DEPRECATION_WARNING=1
U kunt ook zelf een nieuwere versie van bash downloaden en installeren. Houd er rekening mee dat aangepaste bash-installaties in een andere directory staan, meestal /usr/local/bin/bash
.
Blijft bash voor onbepaalde tijd bestaan?
Apple geeft sterk de boodschap dat u van shell moet wisselen. Dit is anders dan de laatste switch in Mac OS X 10.3 Panther, toen Apple de standaard overschakelde naar bash
, maar er niet echt om gaf of je op tcsh
bleef. In feite is tcsh
nog steeds aanwezig op macOS.
Apple’s berichtgeving zou ons moeten vertellen, dat de dagen van /bin/bash
geteld zijn. Waarschijnlijk niet heel snel, maar uiteindelijk zal het houden van een meer dan tien jaar oude versie van bash
op het systeem een verplichting worden. De ingebouwde bash moest in 2014 gepatcht worden om de ‘Shellshock’ kwetsbaarheid te verminderen. Op een gegeven moment zal Apple de kosten van voortdurend onderhoud te hoog vinden.
Een andere aanwijzing is dat er een nieuwe shell is verschenen op macOS Catalina (en wordt genoemd in het ondersteuningsartikel). De ‘Debian Almquist Shell’ dash
is toegevoegd aan de line-up van shells. dash
is ontworpen als een minimale implementatie van de Posix standaard shell sh
. Tot nu toe, in macOS (inclusief Catalina), roept sh
bash
aan in sh
-compatibiliteitsmodus.
Zoals Apple’s ondersteuningsartikel vermeldt, voegt Catalina ook een nieuw mechanisme toe voor gebruikers en beheerders om te veranderen welke shell sh
-aanroepen afhandelt. MacAdmins of gebruikers kunnen de symbolische link die is opgeslagen in /var/select/sh
veranderen om naar een andere shell te wijzen dan /bin/bash
. Dit verandert welke shell scripts interpreteert die de #!/bin/sh
shebang of scripts aanroepen met sh -c
. Het veranderen van de interpreter voor sh
zou niet moeten, maar kan het gedrag veranderen van verscheidene cruciale scripts in het systeem, beheerhulpmiddelen, en in installateurs, maar kan zeer nuttig zijn voor testdoeleinden.
Al deze veranderingen zijn indicatoren dat Apple zich voorbereidt op het verwijderen van /bin/bash
op een bepaald, nog onbepaald, moment in de toekomst.
Moet ik wachten op Catalina om over te schakelen op zsh?
Nee, zsh
is beschikbaar Mojave en op oudere macOS-versies. U kunt beginnen met het testen van zsh
of zelfs al overschakelen naar uw standaard shell.
Als u gewoon wilt zien hoe zsh
werkt, kunt u gewoon Terminal openen en zsh
typen:
$ zshMacBook%
De belangrijkste verandering die u zult zien is dat de prompt er anders uitziet. zsh
gebruikt het %
teken als standaard prompt. (U kunt dat natuurlijk veranderen.) De meeste navigatietoetsen en andere gedragingen blijven hetzelfde als in bash
.
Als u uw standaard-shell al wilt veranderen in zsh
, kunt u het commando chsh
gebruiken:
$ chsh -s /bin/zsh
Dit vraagt om uw wachtwoord. Dit commando zal niet de huidige shell veranderen, maar alle nieuwe, dus sluit de huidige Terminal vensters en tabs en open een nieuwe.
Hoe is zsh anders?
Zoals bash
(‘Bourne again shell’ ), stamt zsh
af van de ‘Bourne’ familie van shells. Vanwege deze gemeenschappelijke afkomst, gedraagt het zich zeer vergelijkbaar in het dagelijks gebruik. De meest in het oog springende verandering is de andere prompt.
Het belangrijkste verschil tussen bash
en zsh
is de configuratie. Aangezien zsh
de configuratiebestanden van bash
negeert (.bash_profile
of .bashrc
), kunt u aangepaste bash-instellingen niet eenvoudigweg kopiëren naar zsh
. zsh
heeft veel meer opties en punten om de configuratie en het gedrag van zsh
te veranderen. Er is een heel ecosysteem van configuratiehulpmiddelen en thema’s, oh-my-zsh
genaamd, dat erg populair is.
zsh
biedt ook betere configuratie voor automatisch aanvullen, wat veel eenvoudiger is dan in bash
.
Ik plan een aparte post, waarin wordt beschreven hoe u uw configuraties van bash
naar zsh
kunt overzetten (en vertalen).
Hoe zit het met scripts?
Omdat zsh
al lange tijd op macOS aanwezig is, zou je kunnen beginnen met het verplaatsen van je scripts van bash
naar zsh
meteen en zonder achterwaartse compatibiliteit te verliezen. Vergeet alleen niet om de shebang in uw scripts in te stellen op #!/bin/zsh
.
U krijgt een aantal functies waarbij zsh
superieur is aan bash
v3, zoals arrays en associatieve arrays (woordenboeken).
Er is één uitzondering waarbij ik nu zou aanraden om /bin/sh
te gebruiken voor uw scripts: het Recovery-systeem bevat niet de /bin/zsh
-shell, zelfs niet op de Catalina-bèta. Dit kan nog veranderen tijdens de beta fase, of zelfs later, maar dan moet je nog steeds rekening houden met oudere macOS installaties waar zsh
zeker niet aanwezig is in Recovery.
Wanneer je van plan bent om je scripts of pkgs te gebruiken met installatiescripts in een Recovery (of NetInstall, of bootable USB drive) context, zoals Twocanoes MDS, installr of bootstrappr, dan kun je niet vertrouwen op /bin/zsh
.
Omdat we nu weten dat bash
uiteindelijk verdwijnt, is de enige gebruikelijke keuze die overblijft /bin/sh
.
Wanneer u een installatiepakket bouwt, kan het moeilijk zijn om te anticiperen op alle contexten waarin het zou kunnen worden ingezet. Dus, voor installatie pre- en post-install scripts, zou ik aanraden om /bin/sh
te gebruiken als de shebang van nu af aan.
Ik was gewend om het gebruik van /bin/bash
aan te bevelen voor alles wat MacAdmin gerelateerd is. /bin/sh
is zeker een stap terug in functionaliteit, maar het lijkt de veiligste keuze voor verdere ondersteuning.
Samenvatting
Over het geheel genomen, hoewel de berichtgeving van Apple zeer interessant is, is de verandering zelf minder dramatisch dan de krantenkoppen. Apple is niet ‘vervangen’ bash
door zsh
, althans nog niet. Over het geheel genomen zullen we een paar dingen opnieuw moeten bedenken en leren, maar er is ook veel te winnen door eindelijk over te stappen van een tien jaar oude shell naar een nieuwe moderne shell!
Volgende
In het volgende deel zullen we kijken naar de configuratie-bestanden voor zsh
.