Jakie są podstawowe różnice między głównymi powłokami * NIX? [Zamknięte]


52

Jakie są podstawowe różnice między głównymi powłokami * NIX i jakie scenariusze mogą skłonić Cię do korzystania z jednej nad drugą? Rozumiem, że niektóre z nich prawdopodobnie sprowadzają się do preferencji użytkownika, ale kiedykolwiek użyłem tylko bash i jestem zainteresowany, aby dowiedzieć się, gdzie może być przydatna inna powłoka.

Czy ma to również wpływ na napisane przez użytkownika skrypty powłoki, gdy działają one pod tą czy inną powłoką, czy jest to po prostu zmiana powłoki w górnej części pliku? Mój instynkt mówi, że to nie takie proste.

Odpowiedzi:


52

Do użytku interaktywnego istnieją dwa główne rywale, bash i zsh , plus maruder tcsh i nowa ryba .

  • Bash jest oficjalną powłoką projektu GNU i domyślną powłoką w większości dystrybucji Linuksa. W przypadku innych jednorożców, które nie są dostarczane z przyzwoitą interaktywną powłoką w ramach podstawowej instalacji, myślę, że bash jest tym, co ludzie wybierają, w samozbierającej pętli „bash jest wszędzie, więc też go użyję”. Zobacz także Dlaczego wszędzie jest bash? (z dużą ilością informacji historycznych).

  • Zsh ma prawie wszystkie funkcje bash i wiele innych (przydatnych!) Funkcji. Jego główną wadą jest to, że jest mniej znany, co z praktycznego punktu widzenia oznacza, że ​​mniej prawdopodobne jest, że jest już zainstalowany w systemie skonfigurowanym przez kogoś innego i jest o nim mniej dokumentacji stron trzecich. Zobacz także Z jakich funkcji Zsh korzystasz? , Jakie funkcje są w Zsh i brakuje w bash, lub odwrotnie? .

  • Tcsh był kiedyś (do początku lat 90.) powłoką z najlepszymi interaktywnymi funkcjami, takimi jak poprzednik csh. To sprawiło, że stał się popularny do użytku interaktywnego (ale nie do skryptów ). Zsh nadrobił zaległości z tcsh i dość szybko poprawił się dalej, a bash nadrobił zaległości (z programowalnym ukończeniem) na początku 2000 roku, podczas gdy tcsh ledwie poczynił postępy w ciągu ostatnich 15 lat. Dlatego teraz nie ma powodu, aby uczyć się tcsh.

  • Ryba stara się być czystsza od swoich poprzedników. Ma kilka ciekawych funkcji (prostsza składnia, kolorowanie składni w wierszu poleceń), ale brakuje innych (cokolwiek autor nie lubi). Społeczność ryb jest znacznie mniejsza niż nawet zsh, co powoduje, że efekty są jeszcze bardziej dotkliwe.


W przypadku skryptów dostępnych jest kilka języków, w zależności od tego, jak przenośne mają być twoje skrypty.

  • Wszystko, co udaje, że jest uniksowe, ma powłokę pochodzącą od Bourne'a/bin/sh . Wciąż istnieją komercyjne jednorożce, które /bin/shnie są zgodne z POSIX .

  • Prawie każdy obecnie działający unix ma shplik wykonywalny, który jest co najmniej zgodny z co najmniej POSIX.2-1992 i zwykle co najmniej POSIX: 2001, zwany też Single Unix v3 . Ta powłoka może znajdować się w innym katalogu, takim jak /usr/bin/posixlub /usr/xpg6/bin. Warstwy emulacji POSIX istnieją również dla prawie każdego systemu, który jest wystarczająco silny, aby go obsługiwać, co czyni go atrakcyjnym celem.

  • Wiele systemów UNIX ksh93 , która prowadzi kilka bardzo przydatnych funkcji POSIX sh brakuje (tablice, tablice asocjacyjne, Extended globs ( *(foo), @(foo|bar), ...), null Globs ( ~(N)foo*), ...). Ksh było początkowo oprogramowaniem komercyjnym (stało się darmowe w 2000 r., Po ustaleniu niektórych nawyków), a wiele wolnych jednorożców (Linux, * BSD) przyzwyczaiło się do zapewniania tylko znacznie starszego wolnego klona ( pdksh ) bez wielu z tych przydatnych funkcji . Pdksh jest teraz wypierany przez mksh poza OpenBSD, ale nawet mksh nie spełnia wszystkich funkcji ksh93. Dzisiaj nie możesz liczyć na to, że ksh93 będzie dostępny wszędzie, szczególnie w Linuksie, gdzie bash jest normą.

  • Bash jest zawsze dostępny na Linuksie (z wyjątkiem niektórych osadzonych wariantów), a często także na innych unikach. Ma większość użytecznych funkcji ksh93, choć czasem z inną składnią.

  • Zsh ma większość przydatnych funkcji ksh93 i bash. Jego podstawowa składnia jest czystsza, ale niezgodna z Bourne. Z wyjątkiem systemu macOS, nie licz na to, że zsh będzie dostępny w systemie, którego nie zainstalowałeś.

  • Aby uzyskać bardziej zaawansowane skrypty, możesz przejść do Perla lub Pythona . Te języki mają odpowiednie struktury danych, przyzwoite funkcje manipulacji tekstem, przyzwoitą kombinację procesów i mechanizmy komunikacji oraz mnóstwo dostępnych bibliotek. Większość systemów uniksowych je ma, albo w pakiecie z systemem operacyjnym, albo instalowanym przez administratora (ponieważ istnieje tak wiele skryptów Perl i Python, że jest to rzadki system, który nie ma co najmniej jednego z nich).


4
Do pisania skryptów celuję myślnikiem, (chyba że potrzebuję zaawansowanych funkcji bash), który ma minimalny zestaw funkcji i jest skargą na POSIX dla maksymalnej kompatybilności. (i jest mały lekki i szybki)
hildred

Świetna dokumentacja! Dwie notatki. Po pierwsze, Solaris jest jednym z tych „komercyjnych jednorożców, w których / bin / sh nie jest zgodny z POSIX”. W szczególności używa jsh(co nie jest powłoką java!), Która nie ma zmiennego podstawienia, takiego jak ${VAR#foo}i ${VAR%bar}.
Adam Katz

Po drugie, tcshjest dość popularny wśród użytkowników systemu UNIX, który nauczył ich sztuczki przed ~ połowie lat 90-tych (które widzieliśmy wprowadzenie zarówno basha zsh), zwłaszcza wśród starszych UNIX + Cdeweloperów, którzy rozpoczęli życie csh(Przypominamy, że c na cshstoiskach na Cjęzyku , co było inspiracją do różnic w stosunku do muszli typu bourne). Zobacz także programowanie w Csh uważane za szkodliwe , którego często używam w celu uzyskania wskazówek na temat głębokiej magii POSIX (oprócz argumentów anty-csh).
Adam Katz

Mac OS X nigdy nie jest „OS / X”. (: A w jaki sposób zsh jest niezgodny z Bourne? (Cóż, z wyjątkiem takich rzeczy, jak nie dzielenie wyrazów na zmienne.)
SilverWolf - Przywróć Monikę

@seaturtle Brak rozłożenia wyrazów na zmienne jest główną różnicą, która złamałaby wiele skryptów sh, gdybyś próbował uruchomić je z zsh (chyba że uruchamiasz zsh w trybie emulacji sh / ksh).
Gilles 'SO - przestań być zły'

27

Istnieją dwa podstawowe smaki: shell, sh (np. Bash) i csh (np. Tcsh). Do użytku interaktywnego sprowadza się głównie do tego, do czego jesteś przyzwyczajony. Używam csh, a następnie tcsh od lat i zmiana tego byłaby bolesna, tylko dlatego, że jestem do tego przyzwyczajona. Użyłem również bash i nie sądzę, aby istniały jakiekolwiek ważne powody, aby się zmienić. Chyba że jedno lub drugie nie jest dostępne na komputerach, z których regularnie korzystasz.

W przypadku programowania składnia jest inna. Nie możesz po prostu zmienić powłoki, ale musisz również zmienić składnię skryptu. Do pisania skryptów chcesz użyć sh lub bash. Jak wyjaśniono tutaj, składnia jest znacznie łatwiejsza do skryptowania (dzięki Riccardo Murri za link. Jest to dobry przewodnik po skryptach bash.

Jeśli nie zdecydowałeś się na powłokę i spodziewasz się napisać kilka skryptów, użyłbym bash tylko po to, aby zmniejszyć ilość rzeczy, których musisz się nauczyć.


12

W dawnych czasach, kiedy AT&T wynalazł system UNIX, powstał Bourne Shell, napisany przez Steve'a Bourne'a. To było dość podstawowe i brakowało nam wielu narzędzi, które obecnie uważamy za oczywiste.

AT&T tak naprawdę nie był w branży UNIX, więc w tym czasie Berkelely przyjął nieco podstawowy system operacyjny i wprowadził pewne zmiany w BSD UNIX. Wśród wielu zmian znalazła się nowa powłoka o nazwie csh, która miała wiele ulepszeń w stosunku do sh, w tym lepszą kontrolę zadań, lepsze wykorzystanie interaktywne i tak dalej. Niestety zdecydowali, że składnia programowania sh została zasysana i stworzyli własne (nieco źle) skopiowane ze stylów kodowania C. (Klasyczny rant to http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Więc teraz były dwie składnie.

Później wprowadzili ulepszenia do CSH, dodając uzupełnianie tabulatorów i kilka innych rzeczy. Stało się to tcsh, a jeśli używasz CSH, prawdopodobnie używasz tego.

AT&T zdecydowało, że nie jest to całkowicie sprawa biznesu UNIX, i również go dopracowali. David Korn (miły facet) stworzył powłokę Korna. Oparty na pomyśle rozszerzenia składni powłoki Bourne'a, dodał wiele rzeczy zarówno dla programistów, jak i do użytku interaktywnego. W rzeczywistości istnieje kilka wersji i rzadko można zobaczyć takie rzeczy, jak ksh88 i ksh93, oznaczające warianty.

Potem przyszedł FSF i system operacyjny GNU. Chcieli stworzyć własny system operacyjny kompatybilny z UNIX o nazwie Hurd i chcieli dla niego lepszej powłoki. Nazwali bash, bo Bourne Again SHell. Zasady POSIX wszedł właśnie w tym czasie, i chcieli zrobić z powłoki POSIX. Rozejrzeli się wokół, biorąc składnię z powłoki Bourne'a i ulepszenia z powłoki Korna, a także kradnąc i rozszerzając interaktywne funkcje z tcsh. Stał się de facto powłoką w Linuksie, więc jest bardzo powszechny.

Jest też zsh, napisany jako „ostateczna” powłoka. Jest to również bardzo powszechne w świecie Linuksa. Przedłużyło bash (i trochę zapylało, niektóre nowe rzeczy wróciły do ​​bash).

Gdybym miał wybrać powłokę, wybrałbym bash lub zsh. bash jest prawdopodobnie w kilku innych miejscach niż zsh. Zsh jest silniejszy, ale bash był dla mnie w porządku. Prawdziwa powłoka Bourne'a / bin / sh jest dostępna tylko z powodów historycznych. bash ma prawie wszystko, co ksh ma do zaoferowania i wiele więcej. Składnia jest czystsza niż csh lub tcsh i ma lepsze funkcje niż jedna z nich.

Konwersja skryptu zależy od tego na co. Styl powłoki Bourne'a (sh, ksh, bash, zsh) do lub ze stylu csh (csh, tcsh) będzie trudny. Przejście ze starego do nowszego (/ bin / sh => bash, / bin / ksh => zsh) będzie łatwiejsze niż w drugą stronę.


Pamiętaj, że strona csh-whynot została napisana we wrześniu 1995 r. (Sprawdź znacznik wersji u góry). Nie wiem, ale spodziewałbym się, że od 18 lat wiele się zmieni.
CVn

8

Dwie główne gałęzie powłok to pochodne powłoki Bourne'a (sh, bash, ksh, ash, yash i zsh) oraz pochodne csh (tcsh i ... uhm ... tcsh).

Podejrzewam (choć nie mam rzeczywistych liczb), że bash jest najczęściej używanym, wydaje się być domyślną powłoką w większości linuksów.

Większość rzeczy napisanych w jednej pochodnej powłoki Bourne'a prawdopodobnie będzie działać w innych. Większość rzeczy napisanych w powłoce Bourne'a prawdopodobnie będzie wymagać modyfikacji, aby działało pod csh lub tcsh.

Osobiście korzystałem z ksh, kiedy zaczynałem, ponieważ tego właśnie używałem w systemie, którego używałem. Teraz używam głównie bash.


1
fish jest skorupą inspirowaną csh
hildred

1

Z czasem użyłem wielu pocisków. Nie jest to coś bardzo zaawansowanego, ale wiele praktycznych funkcji sysadmin i programowania, które wymagały wystarczającej personalizacji.

Myślę, że zsh ma więcej opcji dostosowywania, przynajmniej kiedyś, ale po dłuższym korzystaniu z niego miałem dość stabilności i problemów z kodowaniem znaków. Bash jest solidny, nigdy nie miał podobnych problemów i jest instalowany wszędzie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.