Mutarea la zsh

nov. 28, 2021
admin

Apple a anunțat că în macOS 10.15 Catalina shell-ul implicit va fi zsh.

În această serie, voi documenta experiențele mele de mutare a bash setărilor, configurațiilor și scripturilor în zsh.

  • Partea 1: Trecerea la zsh (acest articol)
  • Partea 2: Fișiere de configurare
  • Partea 3: Opțiuni de shell
  • Partea 4: Aliasuri și funcții
  • Partea 5: Completări
  • Partea 6: Personalizarea prompt-ului zsh
  • Partea 7: Diverse
  • Partea 8: Scripting zsh

zsh (cred că se pronunță zee-shell, deși zish este amuzant de spus) va succeda bash ca shell implicit. bash a fost shell-ul implicit încă de la Mac OS X 10.3 Panther.

Această serie s-a transformat într-o carte: refăcută și extinsă cu mai multe detalii și subiecte. Ca și celelalte cărți ale mele, intenționez să o actualizez și să adaug la ea și după lansare, menținând-o relevantă și utilă. Puteți să o comandați acum pe Apple Books Store.

De ce?

Binarul bash inclus în macOS a rămas blocat la versiunea 3.2 de multă vreme. bash v4 a fost lansată în 2009, iar bash v5 în ianuarie 2019. Motivul pentru care Apple nu a trecut la aceste versiuni mai noi este că acestea sunt licențiate cu GPL v3. bash v3 este încă GPL v2.

zsh, pe de altă parte, are o licență „de tip MIT”, ceea ce o face mult mai acceptabilă pentru Apple să o includă în sistem în mod implicit. zsh a fost disponibil ca pe macOS de mult timp. Versiunea zsh de pe macOS 10.14 Mojave este destul de nouă (5.3). macOS 10.15 Catalina are versiunea actuală zsh 5.7.1.

Bash a dispărut!?

Nu.

macOS Catalina are în continuare același /bin/bash (versiunea 3.2.57) ca Mojave și versiunile anterioare de macOS. Această modificare este doar pentru conturile noi create pe macOS Catalina. Când faceți upgrade la Catalina, shell-ul implicit al unui utilizator va rămâne ceea ce a fost înainte.

Multe scripturi din macOS, sisteme de management și instalatori Apple și de la terți se bazează pe /bin/bash. Dacă Apple a smuls pur și simplu acest binar în macOS 10.15 Catalina sau chiar 10.16. Multe instalatoare și alte soluții s-ar strica și pur și simplu ar înceta să mai funcționeze.

Utilizatorii care au /bin/bash ca shell implicit pe Catalina vor vedea un prompt la începutul fiecărei sesiuni Terminal care va indica faptul că zsh este acum shell-ul implicit recomandat. Dacă doriți să continuați să utilizați /bin/bash, puteți suprima acest mesaj prin setarea unei variabile de mediu în .bash_profile sau .bashrc.

export BASH_SILENCE_DEPRECATION_WARNING=1

De asemenea, puteți descărca și instala singur o versiune mai nouă de bash. Rețineți că instalațiile bash personalizate rezidă într-un director diferit, de obicei /usr/local/bin/bash.

Va rămâne bash pe termen nelimitat?

Apple vă recomandă insistent să schimbați shell-urile. Acest lucru este diferit de ultima schimbare din Mac OS X 10.3 Panther, când Apple a trecut la bash, dar nu prea i-a păsat dacă ați rămas pe tcsh. De fapt, tcsh este încă prezent pe macOS.

Mesajul Apple ar trebui să ne spună, că zilele lui /bin/bash sunt numărate. Probabil că nu foarte curând, dar, în cele din urmă, păstrarea în sistem a unei versiuni mai vechi de peste zece ani a bash se va transforma într-o responsabilitate. Bash-ul încorporat a trebuit să fie corectat în 2014 pentru a atenua vulnerabilitatea „Shellshock”. La un moment dat, Apple va considera costul întreținerii continue prea mare.

Un alt indiciu este că un nou shell a apărut pe macOS Catalina (și este menționat în articolul de suport). ‘Debian Almquist Shell’ dash a fost adăugat la linia de shell-uri. dash este conceput pentru a fi o implementare minimă a shell-ului standard Posix sh. Până acum, în macOS (inclusiv Catalina),sh invocă bash în modul de compatibilitate sh.

Așa cum menționează articolul de suport al Apple, Catalina adaugă, de asemenea, un nou mecanism prin care utilizatorii și administratorii pot schimba care shell gestionează invocările sh. MacAdmins sau utilizatorii pot schimba legătura simbolică stocată în /var/select/sh pentru a indica un alt shell decât /bin/bash. Acest lucru schimbă ce shell interpretează scripturile shebang-ul #!/bin/sh sau scripturile invocate cu sh -c. Schimbarea interpretorului pentru sh nu ar trebui, dar poate schimba comportamentul mai multor scripturi cruciale în sistem, în instrumentele de gestionare și în instalatori, dar poate fi foarte utilă în scopuri de testare.

Toate aceste modificări sunt indicatori că Apple se pregătește să elimine /bin/bash la un moment dat, încă nedeterminat, în viitor.

Trebuie să aștept ca Catalina să treacă la zsh?

Nu, zsh este disponibil în Mojave și pe versiunile mai vechi de macOS. Puteți începe să testați zsh sau chiar să vă schimbați deja shell-ul implicit.

Dacă doriți doar să vedeți cum funcționează zsh, puteți deschide Terminal și tasta zsh:

$ zshMacBook%

Principala schimbare pe care o veți vedea este că promptul arată diferit. zsh folosește caracterul % ca prompt implicit. (Puteți schimba acest lucru, desigur.) Majoritatea tastelor de navigare și alte comportamente vor rămâne aceleași ca în bash.

Dacă doriți să schimbați deja shell-ul implicit în zsh puteți folosi comanda chsh:

$ chsh -s /bin/zsh

Aceasta vă va cere parola. Această comandă nu va schimba shell-ul curent, ci toate cele noi, așa că închideți ferestrele și filele actuale ale Terminalului și deschideți unul nou.

Cum este zsh diferit?

Ca și bash (‘Bourne again shell’ ), zshderivă din familia de shell-uri ‘Bourne’. Datorită acestei strămoșii comune, se comportă foarte asemănător în utilizarea de zi cu zi. Cea mai evidentă schimbare va fi promptul diferit.

Principala diferență între bash și zsh este configurația. Deoarece zsh ignoră fișierele de configurare bash (.bash_profile sau .bashrc), nu puteți copia pur și simplu setările bash personalizate pe zsh. zsh are mult mai multe opțiuni și puncte pentru a schimba configurația și comportamentul zsh. Există un întreg ecosistem de instrumente de configurare și teme numit oh-my-zsh, care este foarte popular.

zsh De asemenea, 9469> oferă o configurare mai bună pentru autocompletare, care este mult mai ușoară decât în bash.

Plănuiesc o postare separată, care să descrie cum să transferați (și să traduceți) configurațiile dvs. din bash în zsh.

Cum rămâne cu scripturile?

Din moment ce zsh este prezent pe macOS de mult timp, ați putea începe să vă mutați scripturile de la bash la zsh imediat și să nu pierdeți compatibilitatea retroactivă. Amintiți-vă doar să setați shebang-ul din scripturile dvs. la #!/bin/zsh.

Vă veți câștiga unele caracteristici în care zsh este superior la bash v3, cum ar fi array-urile și array-urile asociative (dicționare).

Există o excepție în care aș recomanda acum să folosiți /bin/sh pentru scripturile dvs.: sistemul Recovery nu conține shell-ul /bin/zsh, nici măcar pe Catalina beta. Acest lucru s-ar putea schimba în continuare în timpul fazei beta, sau chiar mai târziu, dar atunci tot trebuie să luați în considerare instalațiile mai vechi de macOS, unde zsh nu este cu siguranță prezent în Recovery.

Când plănuiți să vă folosiți scripturile sau pkg-urile cu scripturi de instalare într-un context Recovery (sau NetInstall, sau unitate USB bootabilă), cum ar fi Twocanoes MDS, installr sau bootstrappr, atunci nu vă puteți baza pe /bin/zsh.

Din moment ce știm acum că bash va dispărea în cele din urmă, singura alegere obișnuită rămasă este /bin/sh.

Când construiți un pachet de instalare, poate fi dificil să anticipați toate contextele în care acesta ar putea fi implementat. Așadar, pentru scripturile de preinstalare și postinstalare, aș recomanda folosirea lui /bin/sh ca shebang de acum încolo.

Recomandam folosirea lui /bin/bash pentru tot ce ține de MacAdmin. /bin/sh este cu siguranță un pas în jos în ceea ce privește funcționalitatea, dar pare a fi cea mai sigură alegere pentru continuarea suportului.

Rezumat

În general, în timp ce mesajele de la Apple sunt foarte interesante, schimbarea în sine este mai puțin dramatică decât titlurile. Apple nu „înlocuiește” bash cu zsh, cel puțin nu încă. În general, va trebui să regândim și să re-învățăm câteva lucruri, dar sunt, de asemenea, multe de câștigat dacă trecem în sfârșit de la un shell vechi de zece ani la unul nou și modern!

Următorul

În partea următoare ne vom uita la fișierele de configurare pentru zsh.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.