Verhuizen naar zsh

nov 28, 2021
admin

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.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.