Passare a zsh

Nov 28, 2021
admin

Apple ha annunciato che in macOS 10.15 Catalina la shell di default sarà zsh.

In questa serie, documenterò le mie esperienze spostando bash impostazioni, configurazioni e script su zsh.

  • Parte 1: Passare a zsh (questo articolo)
  • Parte 2: File di configurazione
  • Parte 3: Opzioni della shell
  • Parte 4: Alias e funzioni
  • Parte 5: Completamenti
  • Parte 6: Personalizzare il zsh Prompt
  • Parte 7: Varie
  • Parte 8: Scripting zsh

zsh (credo si pronunci zee-shell, anche se zish è divertente da dire) succederà a bash come shell di default. bash è stata la shell predefinita da Mac OS X 10.3 Panther.

Questa serie è diventata un libro: rielaborata e ampliata con più dettagli e argomenti. Come gli altri miei libri, ho intenzione di aggiornarlo e aggiungerci qualcosa anche dopo il rilascio, mantenendolo rilevante e utile. Potete ordinarlo sull’Apple Books Store ora.

Perché?

Il binario bash fornito con macOS è stato bloccato alla versione 3.2 per molto tempo. bash v4 è stato rilasciato nel 2009 e bash v5 nel gennaio 2019. Il motivo per cui Apple non è passata a queste versioni più recenti è che sono concesse in licenza con GPL v3. bash v3 è ancora GPL v2.

zsh, d’altra parte, ha una licenza ‘MIT-like’, che lo rende molto più appetibile per Apple da includere nel sistema di default. zsh è stato disponibile come su macOS per molto tempo. La versione zsh su macOS 10.14 Mojave è abbastanza nuova (5.3). macOS 10.15 Catalina ha l’attuale zsh 5.7.1.

Il bash è sparito?

No.

macOS Catalina ha ancora lo stesso /bin/bash (versione 3.2.57) come Mojave e versioni precedenti di macOS. Questo cambiamento è solo per i nuovi account creati su macOS Catalina. Quando si aggiorna a Catalina, la shell predefinita di un utente rimarrà quella che era prima.

Molti script in macOS, sistemi di gestione e installatori Apple e di terze parti si basano su /bin/bash. Se Apple ha appena eliminato questo binario in macOS 10.15 Catalina o anche 10.16. Molti installatori e altre soluzioni si romperebbero e semplicemente smetterebbero di funzionare.

Gli utenti che hanno /bin/bash come shell predefinita su Catalina vedranno un prompt all’inizio di ogni sessione di Terminale che afferma che zsh è ora la shell predefinita raccomandata. Se vuoi continuare ad usare /bin/bash, puoi sopprimere questo messaggio impostando una variabile d’ambiente nel tuo .bash_profile o .bashrc.

export BASH_SILENCE_DEPRECATION_WARNING=1

Puoi anche scaricare e installare una versione più recente di bash. Tieni a mente che le installazioni personalizzate di bash risiedono in una directory diversa, di solito /usr/local/bin/bash.

Bash rimarrà indefinitamente?

Apple sta fortemente mettendo in guardia sul fatto che dovresti cambiare shell. Questo è diverso dall’ultimo cambio in Mac OS X 10.3 Panther, quando Apple ha cambiato il default in bash, ma non si è preoccupata se siete rimasti su tcsh. Infatti, tcsh è ancora presente su macOS.

La messaggistica di Apple dovrebbe dirci che i giorni di /bin/bash sono contati. Probabilmente non molto presto, ma alla fine mantenere una versione più vecchia di dieci anni di bash sul sistema diventerà una responsabilità. La bash integrata ha dovuto essere patchata nel 2014 per mitigare la vulnerabilità ‘Shellshock’. Ad un certo punto Apple considererà il costo della continua manutenzione troppo alto.

Un altro indizio è che una nuova shell è apparsa su macOS Catalina (ed è menzionata nell’articolo di supporto). La ‘Debian Almquist Shell’ dash è stata aggiunta alla schiera di shell. dash è progettato per essere un’implementazione minima della shell standard Posix sh. Finora, in macOS (incluso Catalina), sh invoca bash in modalità sh-compatibilità.

Come menzionato nell’articolo di supporto di Apple, Catalina aggiunge anche un nuovo meccanismo per utenti e amministratori per cambiare quale shell gestisce le invocazioni sh. I MacAdmin o gli utenti possono cambiare il link simbolico memorizzato in /var/select/sh per puntare a una shell diversa da /bin/bash. Questo cambia quale shell interpreta gli script lo shebang #!/bin/sh o gli script invocati con sh -c. Cambiare l’interprete per sh non dovrebbe, ma può cambiare il comportamento di diversi script cruciali nel sistema, negli strumenti di gestione e negli installatori, ma può essere molto utile per scopi di test.

Tutti questi cambiamenti sono indicatori che Apple si sta preparando a rimuovere /bin/bash in qualche momento, ancora indeterminato, in futuro.

Devo aspettare che Catalina passi a zsh?

No, zsh è disponibile su Mojave e su versioni precedenti di macOS. Puoi iniziare a testare zsh o anche cambiare la tua shell predefinita.

Se vuoi solo vedere come funziona zsh, puoi semplicemente aprire il Terminale e digitare zsh:

$ zshMacBook%

Il cambiamento principale che vedrai è che il prompt sembra diverso. zsh usa il carattere % come prompt di default. (La maggior parte delle sequenze di tasti di navigazione e altri comportamenti rimarranno gli stessi di bash.

Se vuoi già passare la tua shell di default a zsh puoi usare il comando chsh:

$ chsh -s /bin/zsh

Questo richiederà la tua password. Questo comando non cambierà la shell corrente, ma tutte le nuove, quindi chiudi le attuali finestre e schede del terminale e aprine una nuova.

Come è diverso zsh?

Come bash (‘Bourne again shell’), zshderiva dalla famiglia delle shell ‘Bourne’. A causa di questa ascendenza comune, si comporta in modo molto simile nell’uso quotidiano. Il cambiamento più ovvio sarà il diverso prompt.

La principale differenza tra bash e zsh è la configurazione. Poiché zsh ignora i file di configurazione di bash (.bash_profile o .bashrc) non puoi semplicemente copiare le impostazioni personalizzate di bash su zsh. zsh ha molte più opzioni e punti per cambiare la configurazione e il comportamento di zsh. C’è un intero ecosistema di strumenti di configurazione e temi chiamato oh-my-zsh che è molto popolare.

zsh offre anche una migliore configurazione per il completamento automatico che è molto più facile che in bash.

Sto pianificando un post separato, descrivendo come trasferire (e tradurre) le vostre configurazioni da bash a zsh.

Che mi dici dello scripting?

Siccome zsh è presente su macOS da molto tempo, potresti iniziare a spostare i tuoi script da bash a zsh subito e non perdere la compatibilità all’indietro. Ricordatevi solo di impostare lo shebang nei vostri script a #!/bin/zsh.

Avrete alcune caratteristiche in cui zsh è superiore a bash v3, come gli array e gli array associativi (dizionari).

C’è un’eccezione per cui ora raccomanderei di usare /bin/sh per i vostri script: il sistema di recupero non contiene la shell /bin/zsh, anche sulla beta di Catalina. Questo potrebbe ancora cambiare durante la fase beta, o anche dopo, ma allora dovete ancora considerare le vecchie installazioni di macOS dove zsh non è sicuramente presente in Recovery.

Quando avete intenzione di utilizzare i vostri script o pkgs con script di installazione in un contesto Recovery (o NetInstall, o unità USB avviabile), come Twocanoes MDS, installr o bootstrappr, allora non potete fare affidamento su /bin/zsh.

Siccome ora sappiamo che bash alla fine sparirà, l’unica scelta comune rimasta è /bin/sh.

Quando si costruisce un pacchetto di installazione, può essere difficile prevedere tutti i contesti in cui potrebbe essere distribuito. Quindi, per gli script di pre e post installazione, raccomanderei di usare /bin/sh come shebang d’ora in poi.

Sono solito raccomandare di usare /bin/bash per tutto ciò che riguarda MacAdmin. /bin/sh è sicuramente un passo indietro nella funzionalità, ma sembra la scelta più sicura per il supporto continuo.

Sommario

In generale, mentre il messaggio di Apple è molto interessante, il cambiamento stesso è meno drammatico dei titoli. Apple non sta ‘sostituendo’ bash con zsh, almeno non ancora. Nel complesso, dovremo ripensare e reimparare alcune cose, ma c’è anche molto da guadagnare nel passare finalmente da una shell vecchia di dieci anni a una nuova e moderna!

Prossimo

Nella prossima parte vedremo i file di configurazione per zsh.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.