Jaki jest sens połączenia sh z myślnikiem?

36

Zastanawiam się, do czego służy shbycie symbolicznym dash? Rozumiem, że dashto powinno być szybsze niż bash, ale nie jestem pewien, dlaczego oryginalna shpowłoka nie jest obecna sh.

A jeśli coś, z czym nie jest shpowiązane bash?

NerdOfCode
źródło

Odpowiedzi:

72

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/shprzez 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 shfunkcji, 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/shmusiał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 shnazwie „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/shw Debianie zamiast bash. Ubuntu zaczęło się, zanim Debian zaczął systematycznie traktować bashizmy (wykorzystanie funkcji specyficznych dla bash w #!/bin/shskryptach) 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/shjest 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.

Gilles „SO- przestań być zły”
źródło
Twierdzę, że istnieją dobre powody, aby używać ksh93 jako / bin / sh - jest to jedna z najbardziej wydajnych dostępnych powłok POSIX. Zgodzono się, że wszechobecność Dasha jest kwestią czasu.
Charles Duffy
2
@CharlesDuffy Ksh93 jest szybszy w robieniu skomplikowanych rzeczy, ale dash bije go na czas uruchamiania, a dla prostych skryptów (takich jak wszystkie wywołania system(3), które tworzą aplikacje) jest to czynnik dominujący.
Gilles „SO- przestań być zły”
21

Głównymi czynnikami są szybkość i zgodność z POSIX (innymi słowy przenośność). Pamiętaj, że /bin/shjest 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 bashsą 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.

Zobacz https://wiki.ubuntu.com/DashAsBinSh

Sergiy Kolodyazhnyy
źródło
Nie dashobsługuje funkcji, które nie są wymagane przez POSIX?
NerdOfLinux
@NerdOfLinux Nie ma znaczenia, co obsługuje / bin / sh oprócz POSIX (o ile te dodatki nie łamią skryptów POSIX); ważne jest to, że obsługuje wszystko POSIX (i jest tak szybki, jak to możliwe). Dopóki myślnik spełnia te wymagania, / bin / sh może się z nim połączyć.
Guntram Blohm obsługuje Monikę
9

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/shzamiast 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/shBash. 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/shz 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/shktó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.

thomasrutter
źródło
„Dash jest bardzo szybki, ale także bardzo kompatybilny z POSIX - standard, który jest ściśle dopasowany do powłoki Bourne'a.” Tak, chociaż POSIX jest bliżej związany ksh, powiedziałbym. Nie przypominam sobie powłoki Bourne'a z rozszerzeniem arytmetycznym `$ (())`, czyli POSIX.
Sergiy Kolodyazhnyy
1
Również w Bourne ^jest postacią potoku - więc echo foo ^ catbędzie emitował foo ^ catw POSIX sh, ale foow Bourne; ten konkretny test jest sposobem, w jaki Autoconf rozróżnia te dwa elementy.
Charles Duffy
Ciekawe, więc przez POSIX masz na myśli Korn?
thomasrutter
0

/bin/shjest powiązany z, /bin/dashmoim zdaniem, względami kompatybilności. Wiele skryptów zaczyna się od

#!/bin/sh

więc przechodząc do dashi nie tworząc dowiązania symbolicznego, wiele skryptów nie działałoby poprawnie (lub wcale), gdyby w /bin/shogóle nie istniały.

Zmianę wprowadzono od bashdo, dashponieważ 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.

shnie 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ć bashjako /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 dashzapewniają, ż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!

NerdOfLinux
źródło
Zrozumiałem, że zgodność może być czynnikiem, ale szukałem nie tak oczywistej i dogłębniejszej odpowiedzi ...
NerdOfCode
2
Więc gdybym zainstalować oryginalny Bourne Shell sh, aby /bin/shbyłoby to zepsuć tych skryptów startowych?
deser
Prawdopodobnie najlepiej wypróbować to na maszynie wirtualnej przed wdrożeniem do prawdziwego świata ...
NerdOfCode,
2
Powinieneś odejść /bin/shjako 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.
thomasrutter
1
@mckenzm Która powłoka /bin/shprowadzi do oddzielnej powłoki od tego, który określony użytkownik ustawił jako początkową powłokę logowania. Celem /bin/shnie 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-reconfiguremusi 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ą chshpolecenia. Nazwa początkowej powłoki logowania również się $SHELLpojawia i jest używana w niektórych interaktywnych powłokach niezalogowanych.
Eliah Kagan