Krótka odpowiedź na pytanie „dlaczego nie ma oryginalnej powłoki sh sh
” jest taka, że nie ma oryginalnego sh.
Cóż, ok, jest: to skorupa Thompsona . Wersja 1 zawierała niektóre funkcje, które znamy dzisiaj, w szczególności przekierowanie i potoki (przeczytaj artykuł Dennisa Ritchiego na temat wczesnej historii Uniksa ). Późniejsze wersje dodały funkcje, takie jak wykonywanie w tle za pomocą &
, globowanie (zaimplementowane z programem zewnętrznym) i niektóre formy cytowania, ale nie miały zmiennych ani zagnieżdżonych struktur kontrolnych. Warunki i pętle były dostarczane przez programy zewnętrzne if
(które przyjmowały jeden warunek i jedną komendę jako argumenty) i goto
(które działały, zmieniając pozycję pliku nadrzędnego w pliku skryptu).
W 1979 roku, w Unix V7 , Thompson jako powłoka została zastąpiona /bin/sh
przez powłoki Bourne . Pierwsze wydanie miało już wiele funkcji obecnych w desce rozdzielczej, a kolejne wersje wprowadziły wiele innych . Kilka lat później na scenę wkroczyła skorupa Korna z rosnącym zestawem funkcji; wiele wariantów Uniksa zainstalowało go pod nazwą ksh
.
W 1992 roku POSIX skodyfikował minimalny zestaw sh
funkcji, który był w zasadzie Bourne i kilka rzeczy. Każdy system, który nazywał się „Unix”, musiał implementować przynajmniej te funkcje. Komercyjne systemy uniksowe zwykle używały ksh jako POSIX sh, ale kilka (np. OSF / 1 ) miało własne.
Do niedawna ani powłoka Bourne'a, ani Korna nie były otwarte, więc kiedy świat Linuksa zaczął się formować w połowie lat 90., nie był dostępny. /bin/sh
musiało być coś innego. Większość dystrybucji Linuksa poszła na bash , powłokę z projektu GNU, która zwykle znajdowała się pomiędzy Bourne'em i Kornem pod względem funkcji skryptowych i znacznie lepsza niż każda z nich do użytku interaktywnego). Jedyną realną alternatywą był pdksh („public public Korn shell”), darmowy (teraz wycofany, ale żyjący jako mksh , który jest aktywnie rozwijany ), ale nie pamiętam dystrybucji Linuksa używającej pdksh jako/bin/sh
, Nie wiem dlaczego, ponieważ wydaje się, że dystrybucje Linuksa zawsze były dystrybucjami GNU / Linux, w zasadzie dostarczając wersje GNU dowolnego narzędzia, dla którego istniała wersja GNU.
Było też kilka implementacji open source o sh
nazwie „ash”, w szczególności powłoka Almquista , ale były one bardzo niekompletne, brakowało niektórych funkcji POSIX, z których ludzie chcieli korzystać. Programista, który był opiekunem Debiana, Herbert Xu , rozszerzył program Ash, aby był zgodny z POSIX. W końcu jego wersja została przemianowana na dash, i było trochę nacisków, aby zrobić to /bin/sh
w Debianie zamiast bash. Ubuntu zaczęło się, zanim Debian zaczął systematycznie traktować bashizmy (wykorzystanie funkcji specyficznych dla bash w #!/bin/sh
skryptach) jako błędy . Oba zmieniły później ( Ubuntu 6.10 , Debian dopiero w 2009 roku ( był to cel dla Lenny) ale zmiana została dokonana dopiero po wydaniu Lenny, tj. w squeeze)).
Głównym powodem korzystania kreskę jak zamiast bash jak /bin/sh
jest to, że znacznie szybciej. Było to szczególnie ważne dla Ubuntu, który od samego początku starał się utrzymywać krótkie czasy rozruchu. Dash zwykle zużywa mniej pamięci niż bash, co jest nieco ważne w przypadku skryptów otoki, które pozostają w pobliżu, aby wykonać trochę czyszczenia po wyjściu z bazowego programu. Kolejną zaletą dash jest to, że polega on tylko na libc (podstawowa biblioteka systemowa), podczas gdy bash opiera się również na bibliotekach obsługi terminali (nie można bez nich uruchomić, nawet aby uruchomić skrypt); oznacza to, że dash ma większą szansę na kontynuowanie pracy w uszkodzonym systemie.
W pewnym momencie XXI wieku powłoka Korn przeszła na open source i pojawiły się wersje open source powłoki Bourne'a (stare wersje, ponieważ rozwój przestał istnieć wiele lat wcześniej). Ale dash i bash były zbyt mocno zakorzenione w świecie Linuksa, aby mogły zyskać jakąkolwiek akceptację, szczególnie powłokę Bourne'a, ponieważ jej dzisiejsza wartość jest tylko historyczna. Dash przesunął bash, ponieważ miał wyraźne zalety, ale żaden z pozostałych rywali nie ma żadnej decydującej przewagi jako /bin/sh
.
system
(3), które tworzą aplikacje) jest to czynnik dominujący.Głównymi czynnikami są szybkość i zgodność z POSIX (innymi słowy przenośność). Pamiętaj, że
/bin/sh
jest to przeznaczone dla skryptów systemowych, które mogą, ale nie muszą, pochodzić ze starszych wersji Ubuntu i / lub innych systemów.Jasne, błyszczące funkcje
bash
są fajne w użyciu dla nas użytkowników, ale jeśli chodzi o działanie w środowisku, w którym musisz zarządzać kilkoma różnymi serwerami / systemami - posiadanie powłoki zgodnej z POSIX robi ogromną różnicę. Zwłaszcza jeśli jesteś nowym sysadminem i dziedziczonym środowiskiem z wieloma skryptami.Co do tego, dlaczego oryginalna skorupa Bourne'a nie jest obecna, jest prosta - jest to zastrzeżony produkt pierwotnie będący własnością AT&T Bell Labs.
Ponadto na wiki Ubuntu istnieje wyraźne wyjaśnienie na ten temat:
A oto uwaga na temat przenośności:
Zobacz https://wiki.ubuntu.com/DashAsBinSh
źródło
dash
obsługuje funkcji, które nie są wymagane przezPOSIX
?W dystrybucjach GNU / Linux „oryginał
/bin/sh
” to tak naprawdę Bash.GNU chciało powłoki podobnej do Bourne'a, która była objęta GPL, dlatego właśnie wybrali Bash
/bin/sh
zamiast Bourne'a, który nie miał licencji GPL. Nowoczesne dystrybucje Linuksa odziedziczyły tę decyzję do tego stopnia, że stały się standardem defacto dla/bin/sh
Bash. Oryginalna powłoka Bourne'a („sh”) była używana w innych uniksowych systemach Linux, nawet tak niedawno jak Solaris 10, ale nigdy nie była ostoją dystrybucji Linuksa.Przejście
/bin/sh
z bash na dash było decyzją Debiana (odziedziczoną przez Ubuntu) motywowaną głównie szybkością - przyszło w czasie, gdy włożyli ogromny wysiłek w poprawę prędkości rozruchu i znaczną część czasu procesora rozruchowego w tym samym czasie, co bieganie skrypty inicjujące.Bash jest nadal używany jako domyślna powłoka interaktywna / logowania dla użytkowników, ale Dash jest tym,
/bin/sh
który jest wykonywany dla skryptów systemowych, takich jak skrypty inicjujące.Dash jest bardzo szybki, ale także bardzo kompatybilny z POSIX - standard, który jest ściśle dopasowany do powłoki Bourne'a. W pewnym sensie, przechodząc z Bash na Dash, wracamy do powłoki bardziej zbliżonej do Bourne'a.
źródło
ksh
, powiedziałbym. Nie przypominam sobie powłoki Bourne'a z rozszerzeniem arytmetycznym `$ (())`, czyli POSIX.^
jest postacią potoku - więcecho foo ^ cat
będzie emitowałfoo ^ cat
w POSIX sh, alefoo
w Bourne; ten konkretny test jest sposobem, w jaki Autoconf rozróżnia te dwa elementy./bin/sh
jest powiązany z,/bin/dash
moim zdaniem, względami kompatybilności. Wiele skryptów zaczyna się odwięc przechodząc do
dash
i nie tworząc dowiązania symbolicznego, wiele skryptów nie działałoby poprawnie (lub wcale), gdyby w/bin/sh
ogóle nie istniały.Zmianę wprowadzono od
bash
do,dash
ponieważ zgodnie z https://wiki.ubuntu.com/DashAsBinSh :sh
nie jest powiązanybash
, ponieważJeśli chcesz użyć
bash
jako/bin/sh
:Istnieje kilka funkcji, które
dash
zapewniają, że bash nie, jak:źródło
sh
, aby/bin/sh
byłoby to zepsuć tych skryptów startowych?/bin/sh
jako powłoka dostarczona przez dystrybucję, ponieważ właśnie na nią celowali za pomocą swoich skryptów rozruchowych i tym podobnych. Ale jeśli zastąpiłeś go Bourne, byłby w większości kompatybilny. Wyobrażam sobie jednak, że nastąpią awarie, tylko z powodu drobnych różnic w porównaniu do samej ilości kodu. Oczywiście możesz używać dowolnej powłoki we własnych skryptach z niestandardowym hashbangiem./bin/sh
prowadzi do oddzielnej powłoki od tego, który określony użytkownik ustawił jako początkową powłokę logowania. Celem/bin/sh
nie zależy od których użytkownik szuka, a ty zrobić potrzebę korzystaniasudo
-OR jakieś inne środki działania jako użytkownik root - aby go zmienić. Ponadto, ogólnie i dla każdego pakietu,dpkg-reconfigure
musi być uruchamiany jako root. W przeciwieństwie do tego użytkownicy zwykle mogą zmieniać własną powłokę początkowego logowania i mogą to zrobić za pomocąchsh
polecenia. Nazwa początkowej powłoki logowania również się$SHELL
pojawia i jest używana w niektórych interaktywnych powłokach niezalogowanych.