Przenoszenie do zsh

lis 28, 2021
admin

Apple ogłosiło, że w macOS 10.15 Catalina domyślną powłoką będzie zsh.

W tej serii udokumentuję moje doświadczenia z przenoszeniem bash ustawień, konfiguracji i skryptów do zsh.

  • Część 1: Przenoszenie do zsh (ten artykuł)
  • Część 2: Pliki konfiguracyjne
  • Część 3: Opcje powłoki
  • Część 4: Aliasy i funkcje
  • Część 5: Uzupełnienia
  • Część 6: Dostosowywanie proptu zsh
  • Część 7: Miscellanea
  • Część 8: Skryptowanie zsh

zsh (wierzę, że wymawia się to zee-shell, choć zish jest zabawny do powiedzenia) zastąpi bash jako domyślną powłokę. bash jest domyślną powłoką od Mac OS X 10.3 Panther.

Ta seria przerodziła się w książkę: przerobioną i rozszerzoną o więcej szczegółów i tematów. Podobnie jak inne moje książki, planuję uaktualnić i dodać do niego po wydaniu, jak również, utrzymanie go istotne i przydatne. Możesz ją zamówić w Apple Books Store już teraz.

Why?

Binarny bash dołączony do macOS utknął na wersji 3.2 już od dłuższego czasu. bash v4 został wydany w 2009 roku, a bash v5 w styczniu 2019 roku. Powodem, dla którego Apple nie przeszedł na te nowsze wersje, jest to, że są one licencjonowane z GPL v3. bash v3 jest nadal GPL v2.

zsh, z drugiej strony, ma licencję „MIT-like”, co czyni go znacznie bardziej palatalnym dla Apple, aby domyślnie włączyć go do systemu. zsh jest dostępny jako na macOS od dłuższego czasu. Wersja zsh na macOS 10.14 Mojave jest dość nowa (5.3). macOS 10.15 Catalina ma aktualną zsh 5.7.1.

Is bash gone!?

No.

macOS Catalina wciąż ma tę samą /bin/bash (wersja 3.2.57) co Mojave i wcześniejsze wersje macOS. Ta zmiana dotyczy tylko nowych kont utworzonych w systemie macOS Catalina. Po uaktualnieniu do Cataliny domyślna powłoka użytkownika pozostanie taka, jaka była wcześniej.

Wiele skryptów w macOS, systemach zarządzania oraz instalatorach Apple i innych firm polega na /bin/bash. Jeśli Apple po prostu yanked ten binarny w macOS 10.15 Catalina lub nawet 10.16. Wiele instalatorów i innych rozwiązań uległoby awarii i po prostu przestałoby działać.

Użytkownicy, którzy mają /bin/bash jako domyślną powłokę na Catalinie, zobaczą monit na początku każdej sesji Terminala z informacją, że zsh jest teraz zalecaną domyślną powłoką. Jeśli chcesz nadal używać /bin/bash, możesz wyciszyć ten komunikat, ustawiając zmienną środowiskową w swoim .bash_profile lub .bashrc.

export BASH_SILENCE_DEPRECATION_WARNING=1

Możesz również pobrać i zainstalować nowszą wersję bash samodzielnie. Należy pamiętać, że niestandardowe instalacje basha rezydują w innym katalogu, zwykle /usr/local/bin/bash.

Czy bash pozostanie na zawsze?

Apple zdecydowanie zaleca zmianę powłoki. Różni się to od ostatniego przełączenia w Mac OS X 10.3 Panther, kiedy Apple zmieniło domyślną na bash, ale tak naprawdę nie dbało o to, czy pozostaniesz na tcsh. W rzeczywistości, tcsh jest nadal obecny na macOS.

Wiadomości Apple powinny nam powiedzieć, że dni /bin/bash są policzone. Prawdopodobnie nieprędko, ale w końcu trzymanie ponad dziesięcioletniej wersji bash w systemie stanie się odpowiedzialnością. Wbudowany bash musiał zostać załatany w 2014 roku, aby zniwelować lukę „Shellshock”. W pewnym momencie Apple uzna, że koszty dalszego utrzymania są zbyt wysokie.

Kolejną wskazówką jest to, że na macOS Catalina pojawiła się nowa powłoka (i jest wspomniana w artykule wsparcia). The 'Debian Almquist Shell’ dash został dodany do składu powłok. dash jest zaprojektowana jako minimalna implementacja standardowej powłoki Posix sh. Do tej pory w macOS (w tym Catalina) sh wywołuje bash w trybie zgodności sh.

Jak wspomina artykuł wsparcia Apple, Catalina dodaje również nowy mechanizm dla użytkowników i administratorów, aby zmienić, która powłoka obsługuje wywołania sh. MacAdmins lub użytkownicy mogą zmienić dowiązanie symboliczne przechowywane w /var/select/sh, aby wskazywało na powłokę inną niż /bin/bash. Zmienia to, która powłoka interpretuje skrypty #!/bin/sh shebang lub skrypty wywoływane przy pomocy sh -c. Zmiana interpretera dla sh nie powinna, ale może zmienić zachowanie kilku kluczowych skryptów w systemie, narzędziach zarządzania i w instalatorach, ale może być bardzo przydatna do celów testowych.

Wszystkie te zmiany są wskaźnikami, że Apple przygotowuje się do usunięcia /bin/bash w jakimś, jeszcze nieokreślonym, czasie w przyszłości.

Czy muszę czekać, aż Catalina przejdzie na zsh?

Nie, zsh jest dostępny Mojave i na starszych wersjach macOS. Możesz zacząć testować zsh lub nawet przełączyć swoją domyślną powłokę już teraz.

Jeśli chcesz tylko zobaczyć, jak działa zsh, możesz po prostu otworzyć Terminal i wpisać zsh:

$ zshMacBook%

Główną zmianą, jaką zobaczysz, jest to, że znak zachęty wygląda inaczej. zsh używa znaku % jako domyślnej zachęty. (Możesz to oczywiście zmienić.) Większość naciśnięć klawiszy nawigacyjnych i innych zachowań pozostanie taka sama jak w bash.

Jeśli chcesz już przełączyć swoją domyślną powłokę na zsh, możesz użyć polecenia chsh:

$ chsh -s /bin/zsh

To spowoduje wyświetlenie monitu o hasło. Polecenie to nie zmieni bieżącej powłoki, lecz wszystkie nowe, więc zamknij bieżące okna i karty Terminala i otwórz nową.

Czym różni się zsh?

Podobnie jak bash (’Bourne again shell’ ), zsh wywodzi się z rodziny powłok 'Bourne’. Z powodu tego wspólnego przodka, zachowuje się ona bardzo podobnie w codziennym użyciu. Najbardziej oczywistą zmianą będzie inny znak zachęty.

Główną różnicą między bash a zsh jest konfiguracja. Ponieważ zsh ignoruje pliki konfiguracyjne bash (.bash_profile lub .bashrc), nie można po prostu skopiować dostosowanych ustawień basha do zsh. zsh ma znacznie więcej opcji i punktów do zmiany konfiguracji i zachowania zsh. Istnieje cały ekosystem narzędzi konfiguracyjnych i motywów o nazwie oh-my-zsh, który jest bardzo popularny.

zsh oferuje również lepszą konfigurację autouzupełniania, która jest znacznie łatwiejsza niż w bash.

Planuję oddzielny post, opisujący jak przenieść (i przetłumaczyć) swoje konfiguracje z bash na zsh.

A co ze skryptami?

Ponieważ zsh jest obecny na macOS od dłuższego czasu, możesz zacząć przenosić swoje skrypty z bash do zsh od razu i nie tracić kompatybilności wstecznej. Pamiętaj tylko, aby ustawić shebang w swoich skryptach na #!/bin/zsh.

Zdobędziesz niektóre funkcje, w których zsh jest lepszy od bash v3, takie jak tablice i tablice asocjacyjne (słowniki).

Jest jeden wyjątek, w którym zalecałbym teraz użycie /bin/sh dla twoich skryptów: system Recovery nie zawiera powłoki /bin/zsh, nawet na Catalinie beta. To może się jeszcze zmienić podczas fazy beta, lub nawet później, ale wtedy nadal musisz brać pod uwagę starsze instalacje macOS, gdzie zsh zdecydowanie nie jest obecne w Recovery.

Gdy planujesz używać swoich skryptów lub pkgs ze skryptami instalacyjnymi w Recovery (lub NetInstall, lub bootowalny dysk USB) w kontekście, takim jak Twocanoes MDS, installr lub bootstrappr, wtedy nie możesz polegać na /bin/zsh.

Ponieważ teraz wiemy, że bash w końcu odejdzie, jedynym wspólnym wyborem pozostaje /bin/sh.

Gdy budujesz pakiet instalatora, może być trudno przewidzieć wszystkie konteksty, w których może on zostać wdrożony. Tak więc, dla skryptów instalacyjnych przed i po instalacji, zalecałbym używanie /bin/sh jako shebang od teraz.

Zwykłem zalecać używanie /bin/bash dla wszystkiego, co jest związane z MacAdminem. /bin/sh jest zdecydowanie krok w dół w funkcjonalności, ale wydaje się, że jest to najbezpieczniejszy wybór dla dalszego wsparcia.

Podsumowanie

Ogółem, podczas gdy komunikaty od Apple są bardzo interesujące, sama zmiana jest mniej dramatyczna niż nagłówki. Apple nie „zastępuje” bash z zsh, przynajmniej jeszcze nie teraz. Ogólnie rzecz biorąc, będziemy musieli ponownie przemyśleć i nauczyć się kilku rzeczy, ale jest też wiele do zyskania dzięki ostatecznemu przejściu z dziesięcioletniej powłoki na nową, nowoczesną!

Next

W następnej części przyjrzymy się plikom konfiguracyjnym dla zsh.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.