Bash jest domyślnie używany w każdej dystrybucji Linuksa, którą wypróbowałem, zamiast alternatyw takich jak Z shell (zsh). Czy jest to techniczny lub historyczny powód?
Bash jest domyślnie używany w każdej dystrybucji Linuksa, którą wypróbowałem, zamiast alternatyw takich jak Z shell (zsh). Czy jest to techniczny lub historyczny powód?
Odpowiedzi:
Historia (zdobyta nie przez badania, ale przez spędzanie zbyt dużo czasu na kontaktach z ludźmi z Bell Labs):
Na początku (jeśli weźmiemy pod uwagę, że początkiem jest Unix w wersji 7) była powłoka Bourne'a. Steve Bourne jako pierwszy pokazał, że powłoka kontrolująca interakcję użytkownika może być programem użytkownika, a nie specjalną częścią systemu operacyjnego. Historyczny przełom. Sama powłoka była stosunkowo czysta do obsługi skryptów, ale nie miała edycji wiersza poleceń ani kontroli zadań. Wprowadzenie Bourne'a do powłoki Unix jest nadal przydatne dla początkujących użytkowników.
Edycja : Zignorowałem trochę „prehistorii” Kena Thompsona i Johna Masheya, także z Multics. Jestem pewien, że Bourne był świadomy całej tej pracy (był w tym samym laboratorium, 1127, w Bell Labs), ale skorupa Bourne'a była ostateczna, a wcześniejsze prace miały niewielki wpływ, z wyjątkiem interpretacji Steve'a Bourne'a. Na przykład, chociaż Ken napisał później kompilator Plan 9 C i miał bardzo duży wpływ na Plan 9, ale artykuł Toma Duffa na temat powłoki Plan 9 (rc) wymienia tylko powłokę Bourne'a, a nie Thompsona.
Powłoka jest tylko programem użytkownika, więc każdy może napisać jeden. Ponieważ wersja 7 Unix powstawała w New Jersey, Berkeley Unix powstawał w Kalifornii. Bill Joy z Berkeley napisał csh
, skorupa C. Joy dodał kontrolę zadań i historię, a później edycję wiersza poleceń, ale nie był świadomy pracy Bourne'a i dlatego oparł swój język na powłoce Thompsona (którą uważałem za „prehistoryczną” w poprzednim punkcie). Społeczność Unix uwielbiała kontrolę pracy, ale także język Bourne'a. Aby uzyskać niezbyt dobrą polemikę z językiem csh, zobacz Programowanie w Csh uważane za szkodliwe . Przez pewien czas wiele osób korzystało csh
interaktywnie z funkcji kontroli pracy i historii, ale używało Bourne'a sh
do pisania skryptów. Ta sytuacja była mniej niż idealna.
Edycja : Podziękowania dla DigitalRoss za wyjaśnienie mi chronologii csh
. Odkąd otrzymałem wykształcenie od ludzi, którzy nazywają BSD „herezją Berkeleya”, brakowało mi tam faktów.
Dave Korn z Bell Labs dokonał genialnej przebudowy powłoki Bourne'a, aby wyprodukować powłokę Korn (ksh). Był w pełni kompatybilny wstecz z powłoką Bourne'a, sh
ale zapewnił mnóstwo nieocenionych ulepszeń. ksh
stał się podstawą standardu POSIX i został dostarczony standardowo z oprogramowaniem Sun. (Dzieje się tak pomimo faktu, że Bill Joy opuścił Berkeley, aby pomóc znaleźć firmę Sun, i był jednym z ich wiodących programistów).
Bell Labs i AT&T głupio nie robią ksh
open source. ksh88
jest szeroko stosowany, ale posiadanie źródeł nie jest legalne. Niektórzy ludzie są tak uzależnieni, że stają się przestępcami cyfrowymi.
Edycja : Czy to naprawdę było tak głupie? Trudno wiedzieć. Berkeley już rozdawał Unix, a wkrótce potem inne korporacje, ale wciąż był to okres, w którym Corporate Masters wierzyli w pobieranie opłat za Unix. Ale wyniki: AT&T Unix nie żyje, po tym, jak wiele razy został sprzedany różnym stronom. BSD i jego pochodne są żywe i mają się dobrze, ale te nowatorskie rzeczy zwane „Linux” i „GNU” mają ogromny ułamek umysłu, który kiedyś należał do Bell Labs.
Fundacja Wolnego Oprogramowania robi „czysty pokój”, od zera implementując powłokę POSIX, przyjmując wszystkie pomysły Dave'a Korna jako aktualne, a także w zwykłym stylu FSF dodając nowe własne funkcje, takie jak programowalne uzupełnianie. Nazywają to skorupą „znowu Bourne'a” lub bash
.
W połowie lat 90. XX wieku otwarte oprogramowanie AT&T jest otwarte ksh93
, ale do tego czasu jest już za późno na powszechne przyjęcie. Umowa licencyjna jest dziwnie niestandardowa. bash
i ksh
różnią się, i ksh
nigdy nie osiągają udziału w rynku proporcjonalnego do jego miejsca w historii.
Lekcje:
Pierwszy odpowiedni produkt na rynek wygrywa (sh).
Ludzie kochają nowe funkcje (kontrola zadań, wykonywanie poleceń), ale kochają je jeszcze bardziej, gdy ich stare skrypty nadal działają.
Edycja : Profesorowie inżynierii powinni pozostawić historię historykom nauki :-)
Bash ma dwie zupełnie różne rzeczy.
To dobra muszla. Jest to jedna z 2 powłok (druga to zsh), która integruje niektóre fajne csh
funkcje, takie jak !
podstawianie historii w składni posix. Ma wiele rozszerzeń, w tym tablice.
Jest to powłoka FSF / GNU. W świecie open source daje to pewien rodzaj upodobania.
Powinienem również dodać, że nie zawsze jest to ustawienie domyślne. ash
jest często używany jako / bin / sh, więc choć bash
może być powłoką interaktywną, ash
jest powłoką „po prostu uruchom plik poleceń”. Jest tak, ponieważ ash
jest mniejszy i szybszy i zawiera funkcje posiksowe, więc jest to odpowiedni podzbiór. Używanie ash
jako interaktywnej powłoki jest czasem problematyczne. Na powiedzmy NetBSD działa dobrze, ponieważ jest tam zbudowany ze wszystkimi funkcjami. To rodzaj ich jednej powłoki, podczas gdy bash
jest to pakiet zewnętrzny. Ale w Linuksie ash
jest zwykle uważany za nieinteraktywny, więc kompilują go bez historii i bez (ważnej) edycji linii na teorii, że jest on po prostu używany do uruchamiania tych ogromnych gnu configure
skryptów.
Prawdziwa historia muszli
AKTUALIZACJA: Istnieje nieprecyzyjna historia kopiowania powłoki z miejsca na miejsce w Internecie, a ludzie w to rozumieją. Spróbuję podać dokładną wersję i podać kilka linków, aby ją uzasadnić tutaj.
<, >, >>, |, &
ale po prostu miał prostą goto
składnię sterowania za pośrednictwem zewnętrznego programu, który szukał na standardowym wejściu. Nie było wtedy złożonych skryptów powłoki. Późniejsze powłoki otworzyłyby polecenie wejściowe na osobnym fd. To może dziś wyglądać prosto, ale w horrorze, który był w latach siedemdziesiątych, był to najlepsza rzecz na świecie. Wierzcie lub nie, ta starożytna skorupa ma dziś swój własny profil na Twitterze i oczywiście stronę główną .csh
, napisany (jak było vi
) przez Bill Joy w UCB. Było to przed readline GNU i linią edycyjną NetBSD, więc musiało wydawać się całkowicie rozsądne robić historię ze !
składnią. Csh dodał większość dzisiejszych funkcji powłoki, ale ze składnią csh. csh nie zmienił żadnej składni , nieodpłatnie lub w inny sposób. W rzeczywistości był wstecznie kompatybilny z powłoką Thompson i pierwotnie zawierał kod źródłowy TS.osh
i csh
kiedyś popularny od pewnego czasu . Nie było internetu i był licencjonowany SW, więc w tym środowisku możliwe, że Stephen Bourne nie wiedział o powłoce Joy, a na pewno Joy nie wiedział o Bourne. Możliwe, że obie powłoki po raz pierwszy się spotkały, kiedy UCB otrzymało VAX i prerelease zapomnianego teraz Unix / 32V . Pamiętam, jak Bill narzekał na przydział pamięci. Zauważ, że obie powłoki były kompatybilne wstecz z powłoką V6, po prostu rozszerzyli składnię w różnych kierunkach. ksh
. Ostatecznie csh
miał częściowo dostępny kod źródłowy, ale został uwikłany w pozew między AT&T a University of California . Były to jednak czasy świetności BSD Unix, ponieważ wyrafinowane firmy, które mogły sobie pozwolić na opłatę w wysokości 50 000 USD, kupiłyby licencję AT&T, ale zainstalowały dystrybucje BSD 4.x, a uniwersytety otrzymały ją za darmo.csh
składnią, jak ze składnią powłoki Bourne'a, a niektórzy połączyli obie. Trzeba było przynajmniej tcsh
, zsh
, bash
, i ash
. Składnia Bourne'a była „oficjalna”, będąc częścią wydawnictw AT&T, ale w tamtych czasach BSD była dość ważna, a Sun, początkowo BSD, dystrybuował sporą ilość oprogramowania uniksowego, które spotkał świat./bin
i /sbin
zależy od /usr
tego, jest to zepsute i musi zostać naprawione; powinny zależeć tylko od bibliotek w /lib
. login
Potrzebuje tylko PAM; „nowszym interfejsem API” wymagającym bibliotek dynamicznych będzie NSS. "Tendencja"? NetBSD 2.0 przeszedł już na w pełni dynamiczny, /bin
a /sbin
5 lat temu, FreeBSD 5.2 jeszcze dłużej, a Linux ... cóż, to różni się w zależności od dystrybucji, ale to też było dawno.
Aby dodać do tego, co powiedział @DigitalRoss
Ponieważ Linux jest tylko jądrem (i wymagał wsparcia), podczas gdy GNU zapewnia (lub zapewnił) wszystkie podstawowe klony oprogramowania uniksowego, które sprawiają, że to, co nazywamy „Linuksem”, jest użyteczne. Bash jest powłoką projektu GNU napisaną jako klon starszej powłoki Bourne'a (sh) z Unix Version 7.
Zgodnie z ankietą unix.com, nie jest to znacznie dalej niż ksh.
/ bin / sh 83 8,96%
/ bin / csh 36 3,89%
/ bin / ksh 370 39,96%
/ bin / tcsh 36 3,89%
/ bin / bash 401 43,30%
Bash jest powszechnie akceptowany ze względu na bogaty zestaw funkcji. Przyjmuje także funkcje z innych powłok, takich jak C-shell i Korn-shell. Proszę spojrzeć na ten zestaw funkcji.
Ponieważ „bash” jest w 100% zgodny z „sh / ksh”, a „ksh” jest powłoką POSIX.
Więc jeśli chcesz mieć system zgodny z POSIX i korzystasz z Linuksa, to użyj bash.
Jeśli korzystasz z komercyjnego systemu Unix, na ogół dostajesz ksh jako domyślną powłokę (czasami zwykły tylko stary sh). Z jakiegoś powodu Sun nadal domyślnie korzysta z płatkowej powłoki csh c-shell.
Zaletą jest przenośność .sh napisane dla hp-ux lub AIX ma duże szanse na uruchomienie jako linuksowe „bash” bez żadnych zmian.
I dodać do wszystkich innych odpowiedzi: zsh
nie ma być kompatybilny wstecz. Prawdopodobnie możesz go skonfigurować tak, aby był kompatybilny, ale wtedy tracisz jego funkcje.
Używam zsh
jako mojej zwykłej interaktywnej powłoki, ale bash
/ dash
wydaje mi się bardziej rozsądna jako języki skryptowe powłoki; robią mniej magii i są bardziej przewidywalne ... jest to dla mnie ważniejsze, gdy piszę scenariusz, który powinien działać przez kilka lat.
Wystarczy pomylić spraw Rada sh
polecenie jest czasami po prostu dowiązaniem symbolicznym do innego programu powłoki, takie jak ash
, bash
lub dash
.
Ubuntu zwykło go łączyć bash
, ponieważ bash
jest zaprojektowany do uruchamiania dowolnego zgodnego skryptu powłoki Bourne'a.
Ostatnio jednak Ubuntu przełączył się na sh
link do dash
. dash
jest przeznaczony do uruchamiania bash
skryptów (a więc także sh
skryptów), ale jest przeznaczony do użycia tylko w skryptach, więc brakuje interaktywnych funkcji bash
. Dzięki temu jest mniejszy i (być może) szybszy.