Zastanawiam się, do czego służy sh
bycie symbolicznym dash
? Rozumiem, że dash
to powinno być szybsze niż bash
, ale nie jestem pewien, dlaczego oryginalna sh
powłoka nie jest obecna sh
.
A jeśli coś, z czym nie jest sh
powiązane bash
?
Zastanawiam się, do czego służy sh
bycie symbolicznym dash
? Rozumiem, że dash
to powinno być szybsze niż bash
, ale nie jestem pewien, dlaczego oryginalna sh
powłoka nie jest obecna sh
.
A jeśli coś, z czym nie jest sh
powiązane bash
?
Odpowiedzi:
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:
Dlaczego dokonano tej zmiany? Głównym powodem zmiany domyślnej powłoki była wydajność. bash to doskonała, w pełni funkcjonalna powłoka odpowiednia do użytku interaktywnego; w rzeczywistości jest to nadal domyślna powłoka logowania. Jednak uruchomienie i działanie jest dość duże i wolne w porównaniu z deską rozdzielczą. Wiele instancji powłoki jest uruchamianych jako część procesu rozruchowego Ubuntu. Zamiast zmieniać każdy z nich osobno, aby działał jawnie pod / bin / dash, zmiana wymagająca znacznej ciągłej konserwacji i która podlegałaby regresji, jeśli nie byłaby uważnie obserwowana, zespół deweloperów Ubuntu uznał, że najlepiej po prostu zmienić domyślna powłoka. Ulepszenia szybkości uruchamiania w Ubuntu 6.10 były często niepoprawnie przypisywane do Upstart, który jest doskonałą platformą do przyszłego rozwoju systemu init, ale w Ubuntu 6. 10 działał głównie w trybie zgodności z Systemem V z niewielkimi zmianami behawioralnymi. Te ulepszenia były w dużej mierze spowodowane zmianą / bin / sh.
A oto uwaga na temat przenośności:
Podręcznik zasad Debiana od dawna nakazuje, aby „skrypty powłoki określające„ / bin / sh ”jako interpreter mogły korzystać tylko z funkcji POSIX”; w rzeczywistości wymóg ten obowiązuje już na długo przed rozpoczęciem projektu Ubuntu. Co więcej, wszystkie skrypty powłoki, które miały być przenośne na inne systemy uniksowe, takie jak BSD lub Solaris, spełniły już ten wymóg. Dlatego uważaliśmy, że wpływ tej zmiany na zgodność byłby minimalny.
dash
obsługuje funkcji, które nie są wymagane przez POSIX
?
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.
ksh
, powiedziałbym. Nie przypominam sobie powłoki Bourne'a z rozszerzeniem arytmetycznym `$ (())`, czyli POSIX.
^
jest postacią potoku - więc echo foo ^ cat
będzie emitował foo ^ cat
w POSIX sh, ale foo
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ę od
#!/bin/sh
wię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 :
Głównym powodem zmiany domyślnej powłoki była wydajność. bash to doskonała, w pełni funkcjonalna powłoka odpowiednia do użytku interaktywnego; w rzeczywistości jest to nadal domyślna powłoka logowania. Jednak uruchomienie i działanie jest dość duże i wolne w porównaniu z deską rozdzielczą. Wiele instancji powłoki jest uruchamianych jako część procesu rozruchowego Ubuntu. Zamiast zmieniać każdy z nich osobno, aby działał jawnie pod / bin / dash, zmiana wymagająca znacznej ciągłej konserwacji i która podlegałaby regresji, jeśli nie byłaby uważnie obserwowana, zespół deweloperów Ubuntu uznał, że najlepiej po prostu zmienić domyślna powłoka.
sh
nie jest powiązany bash
, ponieważ
Podręcznik zasad Debiana od dawna nakazuje, aby „skrypty powłoki określające„ / bin / sh ”jako interpreter mogły korzystać tylko z funkcji POSIX”
Jeśli chcesz użyć bash
jako /bin/sh
:
Jeśli problemy są bardziej rozpowszechnione i chcesz z powrotem zmienić domyślną powłokę systemową, możesz poinstruować system zarządzania pakietami, aby przestał instalować myślnik jako / bin / sh:
sudo dpkg-reconfigure dash
Istnieje kilka funkcji, które dash
zapewniają, że bash nie, jak:
istnieje nawet zewnętrzna szansa, że istnieje kilka skryptów, które teraz zależą od funkcji myślnika, której bash nie zapewnia!
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ę korzystania sudo
-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.