Przenoszenie do zsh
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
.