Jaka jest różnica między bash, zsh, tcsh, sh itd.? Którego powinienem użyć?

Najlepsza odpowiedź

To są wszystkie powłoki, a jest ich o wiele więcej, o których nie wspomniałeś. To, który z nich wybierzesz, zależy od osobistych preferencji.

Pierwsza powłoka to Bourne Shell (lub sh) i była domyślny na Uniksie przez długi czas. Potem pojawiło się główne wyprowadzenie w Uniksie i utworzono od podstaw nową powłokę o nazwie C Shell (lub csh). Po starzejącej się powłoce Bournea pojawiła się kompatybilna, ale znacznie potężniejsza Korn Shell (lub ksh). Dostępne powłoki ogólnie należą do jednej z następujących kategorii: Pochodna powłoki Bourne / Korna (bash), pochodna powłoki C lub klon (tcsh) lub „inne” (takie jak zsh).

Jest wiele powłok do do wyboru, a nie tylko te, o których wspomniałeś. GNU bash wpada w obóz Bourne / Korn Shell i jest obecnie domyślną powłoką w wielu różnych odmianach systemów Unix i Linux. Jeśli używałeś terminala powłoki w systemie Unix lub Linux, są szanse, że to właśnie ten. Jeśli naprawdę i naprawdę chcesz Bourne Shell (sh), wierzę, że jest teraz dostępny za darmo – ale generalnie odrzuca się go, ponieważ nie ma wystarczającej liczby funkcji. Korn Shell jest wstecznie kompatybilny i jest również wolny w postaci klonów (mksh) i niedawno wydanego oryginału (ksh).

W przypadku powłoki C jest tcsh, rozszerzony klon oryginalnego csh . Jest mniej klonów csh, ponieważ csh nie jest postrzegany jako rozwiązanie przyszłości i nie ma tylu użytkowników – jednak wiele wersji BSD Uniksa (takich jak FreeBSD i inne) będzie używać csh jako domyślnej powłoki.

Istnieją warianty, które nie są kompatybilne z sh / ksh ani csh – ale zwykle są to powłoki niszowe. Moimi ulubionymi w tym miejscu byłyby Scheme Shell (scsh) i Plan 9 shell rc – ale nigdy nie są one instalowane domyślnie w systemach Unix lub Linux, a ta pierwsza jest dość duża. zsh również należy do tej „innej” kategorii.

Moja rekomendacja jest trojakiego rodzaju: najpierw wypróbuj domyślną powłokę w systemie – prawie na pewno GNU bash. Bash jest wszędzie i czyta i wykonuje programy Bourne Shell i Korn Shell bez żadnych niezgodności. Po drugie, wypróbuj każdą z powłok, które naprawdę chcesz wypróbować (na przykład zsh lub tcsh) i popracuj z nią przez chwilę i sprawdź, czy spełnia Twoje potrzeby. Wreszcie, po prostu użyj tego, który Ci odpowiada.

Zauważ, że nie „nie musisz pisać skryptów w używanej powłoce: Użyłem powłoki C w sposób interaktywny, ale odmówiłem programowania w niej (wszystkie moje skrypty korzystały z powłoki Korna). W końcu pewnego dnia zanurzyłem się w ksh i nigdy nie oglądałem się za siebie.

Moje ulubione chodzi o mksh (klon Korn Shell bez rozszerzeń) – lub GNU bash z pełną kompatybilnością Korn Shell – lub rc , powłoka z nowego systemu operacyjnego Planu 9, który miał być następcą Uniksa (chociaż to się nie zmaterializowało).

Odpowiedź

Lepiej na co?

Jakie są Twoje kryteria?

Osobiście proponuję bash , ponieważ jest to ustawienie domyślne w systemach Linux i MacOS X oraz jest łatwo dostępny we wszystkich innych formach Uniksa i pod MS Windows poprzez Cygwin i jest domyślny dla Microsoft ™ Windows Services for Linux ” (warstwa / podsystem wsparcia Ubuntu bash ).

Zasadniczo jest to ścieżka najmniejszego oporu, jeśli zamierzasz obsługiwać wiele różnych systemów przez wiele lat… i często będziesz uzyskiwać dostęp do świeżo ponownie utworzonych systemów lub nowo uruchomionych instancji z minimalnymi odchyleniami od podstawowego systemu operacyjnego (jak jest typowe dla skalowanych farm serwerów sieci Web / aplikacji). Jest na tyle blisko powłoki Korna, że ​​niewiele osób znajdzie narożne przypadki, w których różnią się semantyką. (Większość użytkowników nie zauważy różnicy między bardziej minimalnymi klonami powłoki Bournea, takimi jak ash i myślnik i funkcje, które dodaje bash , a tym bardziej rozróżnienie różnic między ksh i bash .

zsh jest prawdopodobnie najpotężniejszym i dostosowywalny. Najlepiej nadaje się dla osób, które naprawdę pasjonują się używaniem i dostosowywaniem swojej powłoki. Wadą korzystania z niej… ze wszystkimi jej ulepszeniami i dostosowaniami… jest to, że użytkownik może uznać za frustrujące wycofanie się z używania innej powłoki, gdy problemy z debugowaniem w systemach, w których zsh nie został (jeszcze) zainstalowany – co jest czymś, co ludzie operatorzy / sysadmins w nowoczesnych środowiskach robią dość często.Jest to również raczej niewygodne podczas pracy ze współpracownikami lub ich mentoringu i próby pokazania im czegoś w ich poleceniu powłoki lub udostępniania ekranu GNU lub tmux z nimi.

Powłoka Korna, ksh , jest lepszą powłoką do tworzenia skryptów niż bash w kilku drobnych szczegółach… ale nie na tyle, by warto było go pobierać, instalować i konfigurować wszędzie.

ksh obsługiwał „tablice asocjacyjne” (hash / dictionaries) przez wiele lat przed dodaniem go przez bash . (Został dodany do bash kilka lat temu i nadal nie jest dołączany do wersji, które są domyślnie dostarczane z MacOS X, na przykład). Dlatego zazwyczaj najlepiej jest po prostu nie używać tablic asocjacyjnych w skryptach powłoki. Jeśli myślisz, że chcesz mieć jego funkcje, zwykle najlepiej jest przełączyć się na Python, Ruby, Perl, TCL / życzenie lub dowolny inny język skryptowy ogólnego przeznaczenia . Po prostu niewiele można zyskać, przełączając się na inną powłokę (pod względem narzutów operacyjnych) tylko dla tej jednej funkcji.

To samo można powiedzieć o ksh Koprocesy .

Jedyną inną zauważalną różnicą jest ta, którą należy wyjaśnić. Rozważmy następującą komendę powłoki:

unset foo; echo bar | read foo; echo "$foo"

Jest to całkowicie poprawne w każdej powłoce kompatybilnej z Bourne. Ale będzie się zachowywać inaczej pod różnymi skorupami. Wyemituje albo ciąg „bar” (i nową linię), albo tylko pustą linię.

bash zrobi drugi, podczas gdy ksh i zsh będą działać w ten pierwszy sposób. Zmienna powłoki „foo” zostanie ustawiona w bieżącej powłoce. Moim zdaniem to preferowana semantyka.

Ale to jest przypadek narożny. O ile wiem, nie jest to objęte specyfikacjami Posix dla powłoki Unix; więc fakt, że zachowanie jest zależne od implementacji, nie jest błędem. Jest to po prostu coś, o czym musi wiedzieć ekspert w powłoce i albo go przetestować, albo obejść.

Przyczyną tego zachowania jest to, że operator „potoku” w powłoce jest komunikacją międzyprocesową mechanizm. Powłoka musi utworzyć podpowłokę, czyli podproces uruchamiający własną kopię pamięci procesu nadrzędnego. Jednak każda dana implementacja może przeanalizować polecenie i uruchomić część przed (po lewej) symbolu potoku w podpowłoce (jak to zrobiono przez ksh i zsh ) lub za (na prawo) potokiem (jak to zostało zrobione przez bash, bardzo starsze wersje ksh (przed wydaniem z 1983 roku?) i starsza powłoka Bournea, a większość jego klonów, takich jak jesion i myślnik .

Jedna praca wokół jest użycie grupowania poleceń, aby upewnić się, że wszystkie polecenia po potoku są „w zasięgu” z wbudowanym odczytem , w ten sposób:

unset foo; echo bar | { read foo; echo "$foo"; }

(Nawiasem mówiąc, ten przykład ujawnia subtelny błąd, który istniał w bash przed 1.4 i który został później naprawiony; parser traktował {} znaki i tokeny ve ry podobnie jak () (nawiasy). Tak więc tolerował pomijanie średnika po moim echo „$ foo” – co było technicznie odchyleniem od specyfikacji. Problem polega na tym, że miliony ludzi używało bash i pisało skrypty w oparciu o założenie, że nie musieli przerywać polecenia przed nawiasem zamykającym – z średnik lub nowa linia. Tak więc niektóre z tych starych skryptów powłoki nadal wykazują ten błąd znacznie ponad dekadę później, a tylko garstka ludzi zna powłokę wystarczająco dobrze, aby ją wykryć i naprawić).

Jeśli chodzi o użycie interaktywne, bash jest wyraźnie lepszy od ksh , ale prawdopodobnie nie do końca dorównuje zsh dla każdego, kto chciałby się uczyć i używać bardzo skomplikowanych ulepszeń i dostosowań.

bash obsługuje programowalne uzupełnianie [Tab] i biblioteki GNU readline , zapewniając niezwykle elastyczną kontrolę nad przypisaniami klawiszy, edycją wiersza poleceń i dostępem do historii poleceń. ksh ma stosunkowo ograniczone polecenie fc (które bash obsługuje również) dla „polecenia naprawy” – to znaczy wybierania elementów z historii, pobierania ich w preferowanym edytorze tekstu i automatycznego wykonywania zawartości tego edytowanego pliku tymczasowego przy zakończeniu.

Ale bash obsługuje to i własne emacs lub vi dostęp do historii i edycja oraz stary csh ! (bang) również operatory.

bash obsługuje vi edytowanie tryb ( set -o vi ), który, o ile dobrze pamiętam, był domyślny w ksh 93. Ale bash domyślnie wybiera tryb emacs ( set -o emacs ). Oczywiście można też użyć polecenia bash bind , aby ponownie powiązać dowolne klucze do dowolnej z wielu funkcji edycji i operacji na historii lub do makr rozszerzających się na dowolny tekst, który możesz chcieć umieścić w wierszu poleceń.

Dodatkowo bash ma wiele „magicznych” zmiennych środowiskowych, które mogą robić rzeczy, które są prawie niewyobrażalnie subtelne i skomplikowane. Na przykład możesz ustawić zmienną PROMPT\_COMMAND tak, aby wykonywała niestandardowe podpięcie za każdym razem, gdy bash zaraz przedstawi swój monit. Więc możesz sprawdzić, czy nie ma magicznego pliku .dot\_file i ponownie dostosować uruchomioną powłokę w oparciu o katalog, w którym się znajdujesz, lub zresetować łańcuch zachęty i kolory ekranu terminala na podstawie pory dnia lub zapytaj o jakąś witrynę internetową i automatycznie wykonaj polecenie oparte na… prawie wszystkim.

(Użyłem tego haka do automatycznej aktywacji środowisk wirtualnych Pythona, po prostu przechodząc do ich katalogu roboczego na przykład).

Jeśli weźmiesz pod uwagę tcsh (lub jego przodek, csh ), to jesteś w małej niszy. Często spotyka się skrypty csh z dziedziny EDA (automatyzacja projektowania elektronicznego). Ale to przypadek historii i większość ludzi pracujących w tej dziedzinie nie używa tcsh do swoich celów interaktywnych.

ryba skorupa jest również niszą. Nigdy nie użyłem go wystarczająco, aby wyrobić sobie opinię na jego temat, a na pewno jest wystarczająco kolorowy. Ale myślę, że będzie to bardzo trudne zadanie, zanim wykształci naprawdę powszechne zwolenników. O ile Apple ™ nie zacznie sprzedawać go jako domyślnej powłoki dla swoich systemów Mac ™, prawdopodobnie pozostanie w swojej niszy w dającej się przewidzieć przyszłości.

Mam więc nadzieję, że dotarłem do celu. Naprawdę nie ma sensu pytać „co jest najlepsze…” (prawie wszystko, gdzie istnieją rozsądne alternatywy).

W przypadku powłok poleceń Uniksa różnice między powłokami kompatybilnymi z Bourne są tak niewielkie, że tylko eksperci mogą je odróżnić, a te mają swoje kompromisy i ostatecznie sprowadzają się do raczej subiektywnych preferencji. Mam współpracowników, którzy pasjonują się swoimi ustawieniami zsh , i innych, którym po prostu zależy. Jestem gdzieś pomiędzy dostosowaniem się do najłatwiej dostępnego wyboru.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *