Dlaczego Bash jest wszędzie (w większości, jeśli nie we wszystkich dystrybucjach Linuksa)?

50

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?

hoju
źródło
1
To nie jest. W moim systemie FreeBSD domyślną powłoką jest tcsh!
54
Twój system FreeBSD nie jest dystrybucją Linuksa.
8
Boże, nie pozwól, żeby między dystrybucjami była jakaś spójność ...
OMG Ponies
4
Nie, ale należy do „wszędzie” :)

Odpowiedzi:

106

Historia (zdobyta nie przez badania, ale przez spędzanie zbyt dużo czasu na kontaktach z ludźmi z Bell Labs):

  1. 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.

  2. 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 cshinteraktywnie z funkcji kontroli pracy i historii, ale używało Bourne'a shdo 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.

  3. 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, shale zapewnił mnóstwo nieocenionych ulepszeń. kshstał 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).

  4. Bell Labs i AT&T głupio nie robią kshopen source. ksh88jest 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.

  5. 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.

  6. 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. bashi kshróżnią się, i kshnigdy 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 :-)

Norman Ramsey
źródło
Myślę, że naprawdę masz najbardziej kompletne i dokładne wyjaśnienie popularności bash nad wszystkim innym. Widziałem środowiska, które domyślnie używają Zsh i nienawidzę ich, ponieważ cała składnia jest trochę odłożona i nie mogę tego rozgryźć lub popełniam błędy.
Pocisk (1) wymaga korekty: zanim pocisk Bourne'a był pociskiem Mashey, a zanim pocisk Mashey był pociskiem ur-Shell, pocisk Kena Thompsona. Zobacz en.wikipedia.org/wiki/Unix_shell
Jim Ferrans
2
Bez winy Normana, jest tutaj wiele nieścisłości. Ken Thompson napisał pierwszą powłokę, która była jedyną powłoką przez V6 i była używana równolegle w V7 i 32 V. Stephen Bourne nie był „pierwszym” pisarzem muszli, przepisał powłokę KT. Csh nie miał kontroli zadań aż do 4.1BSD, chociaż była to pierwsza powłoka, która ją otrzymała. Csh nie zmienił żadnej składni powłoki, był wstecznie kompatybilny z powłoką V6, podobnie jak powłoka Bourne'a. W tamtych czasach prawie cały kod był licencjonowany. Co dokładnie było głupie w pobieraniu opłat licencyjnych dla systemu Unix?
DigitalRoss
2
Prawdopodobnie nie wyjaśniam tego zbyt dobrze, spróbujmy jeszcze raz. Csh poprzedza Bourne , a najpóźniej była równoległa implementacja na kontynencie. (Przed internetem to miało znaczenie.) Czasami siedziałem obok Billa Joya w Cory Hall, kiedy to pisał; Mogę absolutnie zapewnić, że napisał to na V6. Jak powiedziałem, csh (i Bourne) są kompatybilne wstecz z wersją V6-Thompson, ponieważ to wszystko istniało, kiedy je pisali. Oczywiście, że nie jest kompatybilny z Bourne, talenty AFAIK Billa
Joy'a
1
Nie bashwziął się pomysł na programowalne zakończenie tcsh?
46

Bash ma dwie zupełnie różne rzeczy.

  1. To dobra muszla. Jest to jedna z 2 powłok (druga to zsh), która integruje niektóre fajne cshfunkcje, takie jak !podstawianie historii w składni posix. Ma wiele rozszerzeń, w tym tablice.

  2. 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. ashjest często używany jako / bin / sh, więc choć bashmoże być powłoką interaktywną, ashjest powłoką „po prostu uruchom plik poleceń”. Jest tak, ponieważ ashjest mniejszy i szybszy i zawiera funkcje posiksowe, więc jest to odpowiedni podzbiór. Używanie ashjako 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 bashjest to pakiet zewnętrzny. Ale w Linuksie ashjest 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 configureskryptów.

Tale of Two Shells

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.

  1. Pierwsza powłoka z pewnością nie była powłoką Bourne'a, ale została napisana przez samego Kena Thompsona i rozpowszechniana w wersji V6, która jest wersją AT&T wysyłaną do różnych uniwersytetów i laboratoriów rządowych. To właśnie umieściło Unix na mapie. Miał wszystkie podstawy, <, >, >>, |, &ale po prostu miał prostą gotoskł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ą .
  2. Druga powłoka była 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.
  3. Trzecią powłoką była powłoka Bourne'a o innej składni. Unix był rozwijany równolegle w UCB i AT&T. Ta powłoka miał dziwny przydzielania pamięci (myślę, że po prostu stosować więcej pamięci, uwięzionego SIGSEGV, czy nowy brk (2), a następnie ponownie próbował), które sprawiło, że trudno działać na nowych portów Unix, tak oshi cshkiedyś 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.
  4. Teraz naprawdę było wiele niekompatybilnych powłok, do których AT&T dodało kompatybilne z Bourne ksh. Ostatecznie cshmiał 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.
  5. W tej sytuacji z wieloma kwestiami prawnymi i technicznymi podjęto różne niezależne wdrożenia. Przynajmniej tyle osób poszło ze cshskł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.
  6. Częściowo z powodu pozwu USL FSF i Linux miały otwarte pole. Tymczasem AT&T udało się podjąć walkę z jednym z niewielu bytów na ziemi większym niż oni (stan Kalifornia) i ostatecznie nie wygrali pozwu, więc ostatecznie dystrybucja BSD była zgodna z prawem stopa. Ale do tego czasu Linux i bash były wszędzie, więc dziś BSD jest niszą.
  7. Wreszcie, bash jest dobrą powłoką (choć najwyraźniej został odrzucony prywatnie przez oryginalnego autora) i w pełni zasługuje na uznanie za swój własny sukces. csh zostałyby przyćmione przez tcsh i zsh, nawet jeśli ash, bash i ksh nie wygrałyby wojny składni.
DigitalRoss
źródło
Ponadto / bin / sh musi być statycznie powiązany.
Jeśli coś zależy /bini /sbinzależy od /usrtego, jest to zepsute i musi zostać naprawione; powinny zależeć tylko od bibliotek w /lib. loginPotrzebuje tylko PAM; „nowszym interfejsem API” wymagającym bibliotek dynamicznych będzie NSS. "Tendencja"? NetBSD 2.0 przeszedł już na w pełni dynamiczny, /bina /sbin5 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.
ephemient
2
Chcę jasno powiedzieć, że moja odpowiedź jest moją oryginalną pracą; nigdzie nie skopiowano żadnych słów .
Norman Ramsey
1
Jasne, nie miałem na myśli, że to wkleiłeś, tylko, że wokół jest wiele dezinformacji i nie chciałem cię oszukiwać za zgłoszenie już źle zrozumianej historii.
DigitalRoss,
6

Aby dodać do tego, co powiedział @DigitalRoss

  • Bash jest kompletnym zastępczym nadzbiorem dla posix-sh, nawet do tego stopnia, że ​​wywołany jako / bin / sh całkowicie emuluje posix-sh. Posix-sh był „standardem” dla komercyjnych systemów uniksowych jako powłoka wspólnego mianownika. Coś, co zaczyna się od tego i opiera się na nim, zaczyna się od wielu.
dpb
źródło
4

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.

żebraków
źródło
nie pyta „dlaczego istnieje program powłoki”
hasen
@hasen j: Pytanie jest zadawane, czy istnieje historyczny powód, dla którego wszystkie systemy Linux, których użył, domyślnie używają Bash jako powłoki.
zaczyna się
2
@hasen j: żebrak nie odpowiada „dlaczego istnieje program powłoki”. Nie trafiłeś w sedno odpowiedzi, podobnie jak wszyscy inni SO-szarpaniący downvoters oczywiście.
1

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%

HayekSplosives
źródło
0

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.


źródło
0

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.


źródło
kshnie jest powłoką POSIX . Nie ma czegoś takiego jak powłoka POSIX . Istnieją powłoki zgodne ze specyfikacją POSIX, która kshjest jedną, ale w żadnym wypadku nie jedyną.
0

I dodać do wszystkich innych odpowiedzi: zshnie ma być kompatybilny wstecz. Prawdopodobnie możesz go skonfigurować tak, aby był kompatybilny, ale wtedy tracisz jego funkcje.

Używam zshjako mojej zwykłej interaktywnej powłoki, ale bash/ dashwydaje 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.

liori
źródło
0

Wystarczy pomylić spraw Rada shpolecenie jest czasami po prostu dowiązaniem symbolicznym do innego programu powłoki, takie jak ash, bashlub dash.

Ubuntu zwykło go łączyć bash, ponieważ bashjest zaprojektowany do uruchamiania dowolnego zgodnego skryptu powłoki Bourne'a.

Ostatnio jednak Ubuntu przełączył się na shlink do dash. dashjest przeznaczony do uruchamiania bashskryptów (a więc także shskryptó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.

Rachunek
źródło