Dlaczego nikt nie używa prawdziwej powłoki Bourne'a jako / bin / sh?


55

Zauważyłem, że w zasadzie żaden system, z którym kiedykolwiek pracowałem, nie ma /bin/shtak naprawdę pliku wykonywalnego. Zawsze jest to dowiązanie symboliczne do dash, bashw trybie POSIX lub coś podobnego.

Dlaczego? Jakie są wady korzystania z prawdziwego, oryginalnego /bin/sh? (Szybkość? Licencjonowanie?)


3
Używałeś tylko Linuksa, prawda? W Linuksie widziałem tylko „sh jako dowiązanie symboliczne”.
Greg Hewgill,

@GregHewgill Czy najnowsze wersje systemu Solaris nie zawierają dowiązań shsymbolicznych ksh?
Gilles „SO- przestań być zły”

1
@Gilles zgodnie z jedną z odpowiedzi, tak, ponieważ Solaris 11. jest z nią powiązany ksh.
strugee

1
@GregHewgill Użyłem również Darwina, który ma dowiązanie symboliczne do bashIIRC.
strugee

6
Co rozumiesz przez oryginał / bin / sh ? Powłoka Thomson z Unix V1? Powłoka Bourne'a z Unixa V7, która nie miała żadnych funkcji, a nie komentarzy ...? Ten w SysIII, SysV, Solaris, HP / UX, reimplementacja popiołu na BSD? Obecnie shopiera się na standardzie, co oznacza, że ​​możemy mieć kilka implementacji, które będą się zachowywać w jasno określony sposób, o ile użyjesz standardowej składni w swoim skrypcie.
Stéphane Chazelas,

Odpowiedzi:


38

Domyślam się, że brakuje funkcji - bez historii poleceń, bez fantazyjnych przekierowań, bez edycji wiersza poleceń. cshZ tych powodów BSD wprowadziło powłokę C. Innym czynnikiem jest to, że Oryginalna Powłoka Bourne'a była niedawno dostępna w wersji open source . O ile nie masz licencji, nie możesz go rozpowszechniać. To sprawiło, że był on poza zasięgiem bezpłatnych dystrybucji i sprawił, że był ideologicznie niesmaczny dla innych dystrybucji i * BSD.

Ale kod jest już dostępny . Możesz rzucić okiem, skompilować, spróbować.


50
A następnie szybko powróć do tego, czego używałeś wcześniej.
Ignacio Vazquez-Abrams,

24
@strugee „„ brak funkcji ”- dlaczego miałby to być problem?” Tak, dobra uwaga… dlaczego programiści używają bezużytecznych rzeczy, takich jak asembler / C / języki wysokiego poziomu, skoro wszystko, co możesz z nimi zrobić, możesz już pisać język maszynowy bezpośrednio? Faktem jest: cechy = przyspieszenie rozwoju + większa łatwość konserwacji = niższe koszty = lepsze Używanie shjest dokładnie takie samo jak używanie, bashz tym że jest: wolniejsze, programy są dłuższe i trudniejsze w utrzymaniu.
Bakuriu

10
To nie jest tak naprawdę brak funkcji, ale fakt, że POSIX nakazuje shpolecenie uruchomienia powłoki zgodnej z POSIX, czym nie jest starsza powłoka Bourne'a. Choć POSIX nie wymaga shsię w /bin/sh, to katalog najbardziej logiczne, że będzie.
jlliagre

4
@Bakuriu historia poleceń i edycja wiersza poleceń to rzeczy, których tak naprawdę nie potrzebujesz w skrypcie.
strugee

4
@strugee To nie jedyne różnice. Na przykład shnie ma tyldy i nawiasów, niektóre Zabudowy brakuje (np pushdi popd, select) nie arytmetycznego. Brakuje wielu zmiennych, np PIPESTATUS.
Bakuriu,

23

Stwierdzenie w twoim pytaniu jest nieprawidłowe. Solaris do wersji 10 jest zapewnienie prawdziwej starszej powłoki Bourne jako /bin/sh. Zrobiono to, aby nie naruszać kompatybilności ze starymi skryptami, które mogą zawieść z inną powłoką. Ten wybór był jednak bardzo frustrujący.

Większość, jeśli nie wszystkie pozostałe wydania Uniksa i Unixa, w tym Solaris 11, zapewniają powłokę zgodną z /bin/shPOSIX, ponieważ POSIX nakazuje shpolecenie uruchomienia powłoki POSIX, a nie starszej powłoki Bourne, która nie jest zgodna. /bin/shjest ogólnie:

  • ksh88lub ksh93w komercyjnych implementacjach Uniksa
  • zmodyfikowany bashna OS/X(choć kiedyś zsh)
  • ashlub pdkshpochodną w innychBSDs
  • bashlub dashw dystrybucjach Gnu / Linux.

Niekoniecznie jest to łącze, ale może być prawdziwym plikiem wykonywalnym na wielu systemach oprócz Gnu / Linuxes.

Co ciekawe, pomimo tego, co stanowi najbardziej pozytywną odpowiedź na twoje pytanie, to nie brak funkcji skłania deweloperów dystrybucji do zainstalowania czegoś innego niż starsza powłoka Bourne'a, /bin/shale chęć bycia jak najbardziej zgodnym z POSIX, tj. Zachowywania się jak Uniksowy system operacyjny. Fakt, że powłoka POSIX ma więcej funkcji niż starsza powłoka Bourne, jest tylko efektem ubocznym tego standardowego celu zgodności.

Jest również faktem, że niektóre powłoki bashzachowują się inaczej, gdy są wywoływane sh, a to w większości usuwa funkcje z powłoki, a nie na odwrót.


16

O ile mi wiadomo, oryginalna powłoka Bourne'a nie mogła być używana przez BSD i projekt GNU, ze względu na jej licencję.

Wtedy oryginalny Unix nie miał licencji, a projekt GNU potrzebował powłoki, która była objęta GPL, więc użyli bash.

To samo dotyczy BSD4, nadrzędnego dla wszystkich BSD. Dzięki pozwie AT&T musieli przepisać wszystkie źródła oryginalnego Uniksa, w tym powłokę Bourne'a.

W tradycyjnej linii BSD powłoka Bourne'a była wysyłana do wersji 4.3BSD-Reno (ale już nie z Net / 2 i następnymi 4.4BSD). Ze względów licencyjnych został on zastąpiony przez Kennetha Almquista (często nazywanego popiołem) kompatybilnym z bourne, svr4 sh.

Z FreeBSD man sh

Polecenie sh, powłoka Thompson, pojawiło się w wersji 1 AT&T UNIX. W wersji 7 AT&T UNIX został zastąpiony przez powłokę Bourne'a, która odziedziczyła nazwę sh.

Ta wersja sh została przepisana w 1989 roku na licencji BSD po powłoce Bourne'a z AT&T System V wydanie 4 UNIX

Oba projekty musiały więc nie używać powłoki Bourne'a i zadowolić się prawdziwą powłoką open source.


7

Były inne problemy. Bourne Shell użył sbrk () zamiast malloc (), co spowodowało, że nie był zbyt przenośny.

Po tym, jak Bourne Shell stał się OpenSource poprzez OpenSolaris, stworzyłem wersję przenośną hafway, a później naprawdę przenośną, zastępując sbrk () przez malloc () przy pomocy Geoffa Collyera (tej samej osoby, która pomogła uniknąć sbrk () w Korn Shell).

Pierwszym powodem, dla którego stworzyłem przenośną wersję Bourne Shell, jest to, że lubiłem udostępniać edytor historii, który napisałem dla mojego „bsh” w latach 1982–1984, również w Bourne Shell. W międzyczasie przeniosłem większość unikalnych cech, które napisałem dla „bsh” do Bourne Shell.

Jest to między innymi:

  • Kompiluje i działa prawie wszędzie, w tym Cygwin (prawie 2x szybciej niż bash)
  • Edytor historii z buforem pierścieniowym LRU
  • wbudowany TERMCAP
  • Zaawansowane aliasy (globalne trwałe aliasy, lokalne aliasy, ...) oraz wraz z wbudowanym „dosh”, Bourne Shell jest jedyną implementacją podobną do Bourne Shell, która umożliwia parametryzowalne aliasy.
  • Obsługa edycji złożonych aliasów w edytorze historii w trybie surowym.
  • Uzyskaj dostęp do wszystkich 32 bitów kodu wyjścia (2) poprzez zmienne .sh. *.
  • zaawansowany automatyczny pomiar czasu z 6 cyfrową rozdzielczością
  • pushd / popd / dirs
  • wbudowane „znajdź”
  • Rura ze stderr
  • Użycie vfork () dla lepszej wydajności.
  • w końcu naprawiono wszystkie udokumentowane błędy z powłoki SVr4 Bourne Shell, np. zawieszenie zawsze działa w trybie kontroli zadań. ...

Internetowa strona podręcznika znajduje się pod adresem : http://schillix.sourceforge.net/man/man1/bosh.1.html Źródła są częścią przybornika schily:

https://sourceforge.net/projects/schilytools/files/

Polecam użyć: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 lub nowszej wersji.

PS Jestem zainteresowany opiniami


Cześć Joerg. Po co przenosić je do powłoki Bourne'a zamiast powłoki POSIXified, takiej jak niektóre BSD sh lub pdksh?
Stéphane Chazelas,

Przeniesienie Bourne Shell było wyzwaniem, ponieważ nie korzysta ze standardowego interfejsu. Było to podobne wyzwanie, jak pobranie oryginalnego źródła csh i kompilowanie go przez zastąpienie non-stdio printf napisanego w asemblerze VAX. Ale już dodałem wiele nowszych funkcji POSIX do Bourne Shell i lubię pozostać z Bourne Shell na SchilliX, aby umożliwić uruchamianie się z / anr / usr na oddzielnych systemach plików, co nie jest możliwe z Korn Shell.
schily

Zauważ też, że chciałem sprawdzić, czy prędkość ksh jest spowodowana użyciem vfork (). Teraz, kiedy przekonwertowałem Bourne Shell na vfork (), jest on tak samo szybki jak najnowsze wersje ksh. Jest to doświadczenie, które można uzyskać tylko, rozpoczynając od oryginalnego kodu źródłowego Bourne Shell.
schily

OK, ale dopóki nie dostosujesz shIX do zgodności z POSIX, raczej nie wzbudzi to dużego zainteresowania. Pamiętam, jak pytałeś grupę austin ML o niezgodności z POSIX powłoki Bourne'a, czy jest to coś, nad czym pracujesz (co oznaczałoby zerwanie wstecznej kompatybilności z powłoką Bourne'a)? Również ludzie (przynajmniej) uważają składnię sh POSIX za postęp w stosunku do powłoki Bourne'a. Nadal nazywając powłokę Bourne'a, powłoka Bourne'a może wywołać złe wrażenie. Co powiesz na bimsh (ulepszony Bourne (ala vi / vim))?
Stéphane Chazelas,

Moja Bourne Shell jest już lepsza niż ksh w niektórych aspektach, np. Implementuje lepsze aliasy, pushd / popd / dirs i obsługę wykorzystania zasobów w oparciu o nowoczesne funkcje UNIX zamiast tego, co robi ksh, który wciąż jest oparty na SVr2. Ponieważ wydajesz się być zainteresowany i wyszkolony w powłoce, chciałbym dowiedzieć się, co chciałbyś zobaczyć w powłoce Bourne'a po przeczytaniu: schillix.sourceforge.net/man/man1/bosh.1.html Zauważ, że do tej pory mam cały nowy kod # ifdef'd i niektóre funkcje (takie jak rury stderr) muszą być włączone przez set (1).
schily,

4

Jest powiązany z powłokami, które zapewniają 100% kompatybilność wsteczną . Nie tracisz nic, co ma oryginalna powłoka, ale zyskujesz na niej więcej funkcji. Nie ma wady, więc dlaczego przegapić nowe funkcje? Jest to ten sam powód, dla którego /bin/vizwykle jest powiązany z vim .


5
Minusem jest to, że ludzie piszą skrypty działające w jednym systemie, myśląc, że ich skrypt jest kompatybilny, gdy nie jest. Kiedyś naprawiłem prawie sto skryptów powłoki Gentoo, które faktycznie wymagały bash, ale nazwały / bin / sh. Wszystkie się zepsuły, kiedy zmieniłem / bin / sh, aby być kreską zamiast bash.
Zan Lynx,

3
„bez wad” - prędkość. np. bashjest znacznie wolniejszy niżdash
strugee

@strugee Jeśli szukasz szybkości ulepszenia zakresu ms w powłoce, prawdopodobnie nie używasz odpowiedniego narzędzia do tego zadania.
Chris Down,

1
@ChrisDown zdefiniować „ulepszenia zakresu ms”?
strugee,

2
Składnia sh POSIX nie jest w pełni kompatybilna wstecz ze składnią sh Bourne'a. Na przykład IFS=,; rm file1,file2,file3usuną te 3 pliki z powłoki Bourne'a. Ta (głupia) funkcja została usunięta w POSIX sh. Istnieją dziesiątki subtelnych różnic, które mogą spowodować, że skrypt napisany dla powłoki Bourne'a będzie działał inaczej z sh POSIX.
Stéphane Chazelas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.