Widziałem wyrażenie „kompatybilny z sh” używane zwykle w odniesieniu do powłok. Nie jestem pewien, czy dotyczy to również programów, które mogą być uruchamiane z poziomu powłok.
Co to znaczy, że powłoka lub inny program jest „kompatybilny z sh”? Co by to znaczyło być „niekompatybilnym”?
Edycja: To pytanie zadające różnicę między uderzeniem a sh jest bardzo istotne: Różnica między sh i bash
Nadal chciałbym bezpośrednią odpowiedź na to, co to znaczy być „kompatybilnym z sh”. Rozsądnym oczekiwaniem może być to, że „kompatybilny z sh” oznacza „implementuje język poleceń Shell”, ale dlaczego jest tak wiele powłok „sh kompatybilnych” i dlaczego są one różne?
shell
compatibility
Prakseolityczny
źródło
źródło
sh
). W przypadku innej powłoki odnosi się do tego, czy ta powłoka może uruchamiać skrypty powłoki Bourne.Odpowiedzi:
Bourne shell został po raz pierwszy publicznie wydany w 1979 roku jako część Unix V7 . Ponieważ prawie każdy uniksowy i podobny do niego system wywodzi się od V7 Unix - nawet jeśli tylko duchowo - powłoka Bourne'a jest z nami „na zawsze” ¹
Powłoka Bourne'a faktycznie zastąpiła wcześniejszą, ponownie nazwała powłokę Thompson , ale stało się tak wcześnie w historii Unixa, że dziś jest prawie zapomniana. Powłoka Bourne'a jest nadzbiorem powłoki Thompson .²
Nazywano zarówno pociski Bourne'a, jak i Thompsona
sh
. Powłoki określony przez POSIX jest również nazywanysh
. Tak więc, gdy ktoś mówi „sh
kompatybilny”, odnosi się do tej serii powłok. Gdyby chcieli być konkretni, powiedzieliby „powłoka POSIX” lub „powłoka Bourne'a” ³Powłoka POSIX jest oparta na wersji KornShell z 1988 roku , która z kolei miała zastąpić powłokę Bourne'a w AT&T Unix, przeskakując powłokę BSD C pod względem funkcji. ⁴ W zakresie, w jakim
ksh
jest przodkiem powłoki POSIX, większość Systemy uniksowe i podobne do systemu Unix zawierają dziś pewien wariant powłoki Korn. Wyjątkami są na ogół małe systemy osadzone, które nie mogą sobie pozwolić na miejsce, które zajmuje kompletna powłoka POSIX.To powiedziawszy, powłoka Korn - jako odrębna od powłoki POSIX - nigdy tak naprawdę nie stała się popularna poza komercyjnym światem Unix. Jest tak, ponieważ jego wzrost odpowiadał wczesnym latom komercjalizacji Uniksa, więc został wciągnięty w wojny z Unixem . BSD Unixes zrezygnował z niego na rzecz powłoki C, a jego kod źródłowy nie był swobodnie dostępny do użycia w Linuksie, kiedy się zaczął. ⁵ Kiedy pierwsi dystrybutorzy Linuksa zaczęli szukać powłoki poleceń do jądra Linux, zwykle wybierali GNU Bash , jeden z tych
sh
kompatybilnych programów, o których mówiszŻe na początku stowarzyszenie między Linuksem a bash dość dużo przypieczętował los wielu innych pocisków, w tym
ksh
,csh
itcsh
. Dzisiaj są jeszcze bardzo trudni ludzie używający tych pocisków, ale są oni w mniejszościCała ta historia wyjaśnia, dlaczego twórcy względnych spóźniających się, jak
bash
,zsh
iyash
zdecydowali się uczynić jesh
kompatybilnymi: kompatybilność Bourne / POSIX to minimum, jakie musi zapewnić powłoka systemów uniksowych, aby zyskać szerokie zastosowanie.W wielu systemach domyślna interaktywna powłoka poleceń
/bin/sh
jest inna./bin/sh
może:Oryginalna skorupa Bourne'a. Jest to powszechne w starszych systemach UNIX®, takich jak Solaris 10 (wydany w 2005 r.) I jego poprzednicy
Powłoka z certyfikatem POSIX. Jest to powszechne w nowszych systemach UNIX®, takich jak Solaris 11 (2010).
Powłoki Almquist . Jest to klon powłoki Bourne / POSIX o otwartym kodzie źródłowym, pierwotnie wydany na Usenecie w 1989 r. , Który został następnie włączony do CSRG Berkeleya w celu włączenia go w pierwszym wydaniu BSD nie zawierającym kodu źródłowego AT&T, 4.4BSD-Lite . Powłoka Almquista jest często nazywana
ash
, nawet jeśli jest instalowana jako/bin/sh
.4.4BSD-Lite z kolei stało się podstawą wszystkich współczesnych pochodnych BSD,
/bin/sh
pozostając w większości pochodnymi Almquista, z jednym ważnym wyjątkiem wymienionym poniżej. Możesz zobaczyć to bezpośrednie pochodzenie w repozytoriach kodu źródłowego dla NetBSD i FreeBSD : wysyłali pochodną powłoki Almquist od pierwszego dnia.Istnieją dwa ważne
ash
widelce poza światem BSD:dash
, powszechnie przyjęte przez Debian i Ubuntu w 2006 roku jako domyślna/bin/sh
implementacja. (Bash pozostaje domyślną interaktywną powłoką poleceń w pochodnych Debiana).ash
Komenda w BusyBox , który jest często stosowany w wbudowanych dystrybucji Linksa i mogą być wykorzystane do realizacji/bin/sh
. Ponieważ jest on datowanydash
i pochodzi ze staregoash
pakietu Debiana , postanowiłem uznać go za pochodnądash
zamiastash
, pomimo nazwy polecenia w BusyBox.(BusyBox zawiera także mniej funkcjonalną alternatywę dla
ash
wywoływanychhush
. Zazwyczaj tylko jeden z dwóch zostanie wbudowany w dowolny plik binarny BusyBox:ash
domyślnie, alehush
gdy przestrzeń jest bardzo ograniczona. Zatem/bin/sh
w systemach opartych na BusyBox nie zawsze jestdash
podobny.)GNU Bash , który wyłącza większość rozszerzeń innych niż POSIX, gdy jest wywoływany jako
sh
.Ten wybór jest typowy dla wersji Linuksa na komputery i serwery, z wyjątkiem Debiana i jego pochodnych. Mac OS X również to zrobił od czasu wydania Panther w 2003 roku.
Powłoka z
ksh93
rozszerzeniami POSIX , jak w OpenBSD . Chociaż powłoka OpenBSD zmienia zachowanie, aby uniknąć niezgodności składniowej i semantycznej z powłokami Bourne i POSIX po wywołaniu jakosh
, nie wyłącza żadnego z czystych rozszerzeń, ponieważ nie powoduje konfliktu ze starszymi powłokami.To nie jest powszechne; nie powinieneś oczekiwać
ksh93
funkcji w/bin/sh
.Użyłem „skryptu powłoki” powyżej jako ogólnego terminu oznaczającego skrypty powłoki Bourne / POSIX. Wynika to z wszechobecności muszli rodziny Bourne. Aby mówić o skryptach na innych powłokach, musisz podać kwalifikator, na przykład „Skrypt powłoki C.” Nawet w systemach, w których powłoka rodziny C jest domyślną powłoką interaktywną, lepiej jest używać powłoki Bourne'a do pisania skryptów.
Mówi, że kiedy Wikipedia klasyfikuje powłoki Unix , grupują je w kompatybilne z powłoką Bourne'a, kompatybilne z powłoką C i „inne”.
Ten schemat może pomóc:
(Kliknij, aby zobaczyć wersję SVG, 31 kB lub zobacz pełnowymiarową wersję PNG , 218 kB.)
Ktoś mówi o
sh
rzeczy niezgodnej zwykle oznacza jedną z trzech rzeczy:Odnoszą się do jednej z tych „innych” powłok
Rozróżniają rodziny skorup Bourne'a i C.
Mówią o pewnej specyficznej funkcji w jednej powłoce rodziny Bourne, której nie ma we wszystkich innych powłokach rodziny Bourne.
ksh93
,bash
Orazzsh
w szczególności mają wiele cech, które nie istnieją w starszych „standardowych” muszli. Te trzy są również wzajemnie niekompatybilne na wiele sposobów, gdy wyjdziesz poza wspólne POSIX /ksh88
base.Klasycznym błędem jest napisanie skryptu powłoki z
#!/bin/sh
linią shebang u góry, ale użycie w nim rozszerzeń powłoki Bash lub Korn. Ponieważ obecnie/bin/sh
jest jedną z powłok z powyższego schematu rodziny Korn / POSIX na tak wielu systemach, takie skrypty będą działać w systemie, w którym zostały napisane, ale potem zawiodą w systemach, w których/bin/sh
jest coś z szerszej rodziny powłok Bourne'a. Najlepszą praktyką jest używanie linii#!/bin/bash
lub#!/bin/ksh
shebang, jeśli skrypt używa takich rozszerzeń.Istnieje wiele sposobów sprawdzenia, czy dany skrypt powłoki rodziny Bourne jest przenośny:
Uruchom
checkbashisms
na nim narzędzie z projektu Debian, które sprawdza skrypt pod kątem „ bashism ”.Uruchom go pod
posh
powłoką w repozytorium pakietów Debiana, która celowo implementuje tylko funkcje określone przez SUS3 oraz kilka innych drobnych funkcji .Uruchom go
osh
z projektu Schily Tools , ulepszonej wersji powłoki Bourne'a otwartej od Sun w ramach OpenSolarisa w 2005 roku, co czyni ją jednym z najprostszych sposobów na uzyskanie powłoki Bourne'a w stylu z 1979 roku na nowoczesnym komputerze.Dystrybucja Schily Tools obejmuje również
bosh
powłokę typu POSIX z wieloma niestandardowymi funkcjami , ale może być przydatna do testowania zgodności skryptów powłoki przeznaczonych do działania na wszystkich powłokach rodziny POSIX. To wydaje się być bardziej konserwatywny w zestaw funkcji niżbash
,zsh
oraz rozszerzonych wersjachksh93
.Schily Tools zawiera również powłokę o nazwie
bsh
, ale jest to historyczna osobliwość, która wcale nie jest powłoką rodziny Bourne'a.Przejrzyj rozdział Przenośne programowanie powłoki w podręczniku GNU Autoconf . Możesz rozpoznać niektóre problematyczne konstrukcje, o których mówi w swoich skryptach.
Z tych samych powodów wszystkie „Nowe i ulepszone!” rzeczy są różne:
Ulepszoną wersję można ulepszyć tylko poprzez zerwanie z kompatybilnością wsteczną.
Ktoś pomyślał o innym sposobie działania, który im się bardziej podoba, ale który nie jest tym samym, co stary.
Ktoś próbował ponownie wdrożyć stary standard, nie do końca go rozumiejąc, więc popełnił błąd i stworzył niezamierzoną różnicę.
Przypisy i na bok :
Wczesne wersje BSD Unix były tylko dodatkowymi kolekcjami oprogramowania dla V6 Unix. Ponieważ powłoka Bourne'a została dodana do AT&T Unix dopiero w wersji 7, BSD technicznie nie zaczęło od posiadania powłoki Bourne. Odpowiedź BSD do pierwotnego charakteru powłoki Thompson był powłoka C .
Niemniej, pierwsze wersje standalone z BSD (2.9BSD i 3bsd) oparto na V7 lub jego następcy przenośnej UNIX / 32V , więc nie obejmują powłoki Bourne.
(Linia 2BSD stała się równoległym rozwidleniem BSD dla minikomputerów Digital PDP , podczas gdy linie 3BSD i 4BSD wykorzystały nowsze typy komputerów, takie jak stacje robocze Vaxen i Unix . 2.9BSD była zasadniczo wersją PDP 4.1cBSD; były to współczesny, a wspólny kod . PDP nie tylko znikają, gdy VAX przybył, więc linia 2BSD jest nadal guzdrających wzdłuż ).
Można śmiało powiedzieć, że powłoka Bourne'a była wszędzie w świecie uniksowym do 1983 roku. To dobre przybliżenie do „na zawsze” w branży komputerowej. MS-DOS otrzymał w tym roku hierarchiczny system plików (awww, jak cuuute!) I pierwszy 24-bitowy Macintosh z 9 - calowym ekranem czarno - białym - nie w skali szarości, dosłownie czarno - białym - nie pojawiłby się na początku następnego roku.
Pancerz Thompsona był dość prymitywny jak na dzisiejsze standardy. To była tylko interaktywna powłoka poleceń, a nie środowisko programowania skryptów, którego oczekujemy dzisiaj. Miał takie rzeczy jak potoki i przekierowanie I / O, które uważamy za prototypowo część „powłoki Unix”, tak więc myślimy o powłoce poleceń MS-DOS jako o pobieraniu ich z Uniksa.
Bourne powłoki wymienić także powłoki PWB , które dodaje ważne co do powłoki Thompson, jak programowalność (
if
,switch
iwhile
) oraz pierwszą formę zmienne środowiska. Powłoka PWB jest jeszcze mniej dobrze zapamiętywana niż powłoka Thompson, ponieważ nie była częścią każdej wersji Uniksa.Kiedy ktoś nie jest konkretny w kwestii zgodności powłoki POSIX z Bourne, może oznaczać cały szereg rzeczy.
Z jednej strony mogliby użyć powłoki Bourne'a z 1979 r. Jako podstawy. Określenie „
sh
-Kompatybilny skrypt” w tym sensie oznaczałoby oczekuje się, by idealnie na prawdziwej powłoki Bourne lub jego następców prawnych i klonów:ash
,bash
,ksh
,zsh
, etc.Ktoś z drugiej strony przyjmuje zamiast tego powłokę określoną przez POSIX. Obecnie bierzemy tak wiele funkcji powłoki POSIX jako „standardowe”, że często zapominamy, że tak naprawdę nie były one obecne w powłoce Bourne'a: wbudowana arytmetyka, kontrola zadań, historia poleceń, aliasy, edycja wiersza poleceń,
$()
forma polecenia zamiana itp.Chociaż skorupa Korna ma korzenie sięgające wczesnych lat 80., AT&T nie dostarczał jej w Uniksie aż do wydania Systemu V w wersji 4 w 1988 roku. Ponieważ tak wiele komercyjnych Uniksów opiera się na SVR4, wprowadzono
ksh
prawie każdy odpowiedni komercyjny Unix z pod koniec lat 80.(Kilka dziwnych uniksowych smaków opartych na SVR3 i wcześniejszych trzymało się kawałków rynku po wydaniu SVR4, ale były one pierwsze pod ścianą, gdy nadeszła rewolucja ).
Rok 1988 jest również rokiem, w którym pojawił się pierwszy standard POSIX , z opartą na powłoce Korna „powłoką POSIX”. Później, w 1993 roku, pojawiła się ulepszona wersja skorupy Korna. Ponieważ POSIX skutecznie przybił oryginał,
ksh
rozwidlił go na dwie główne wersje:ksh88
iksh93
nazwał po latach zaangażowanych w ich podział.ksh88
nie jest w pełni kompatybilny z POSIX, choć różnice są niewielkie, dlatego niektóre wersjeksh88
powłoki zostały załatane, aby były zgodne z POSIX. (To z ciekawego wywiadu na temat Slashdota z Dr. Davidem G. Kornem . Tak, facet, który napisał powłokę.)ksh93
jest w pełni kompatybilnym nadzbiorem powłoki POSIX . Rozwójksh93
był sporadyczny, odkąd główne repozytorium źródeł zostało przeniesione z AT&T do GitHub, a najnowsze wydanie ma około 3 lat, kiedy to piszę, ksh93v. (Podstawowa nazwa projektu zawieraksh93
sufiksy dodane w celu oznaczenia wersji po 1993 roku).Systemy, które zawierają powłokę Korna jako odrębną rzecz od powłoki POSIX, zwykle udostępniają ją jako
/bin/ksh
, chociaż czasami chowa się gdzie indziej.Kiedy mówimy o
ksh
skorupie Korna z nazwy, mówimy oksh93
cechach, które odróżniają ją od jej kompatybilnych wstecz podzbiorów powłok Bourne i POSIX.ksh88
Dzisiaj rzadko spotykasz się z czystym .AT&T zachował własność kodu źródłowego powłoki Korna do marca 2000 r . W tym momencie powiązanie Linuksa z GNU Bash było bardzo silne. Bash i
ksh93
każdy z nich ma przewagę nad innymi , ale w tym momencie bezwładność utrzymuje Linuksa ściśle związany z Bash.Jeśli chodzi o to, dlaczego pierwsi dostawcy Linuksa najczęściej wybierali GNU Bash
pdksh
, który był dostępny w momencie uruchamiania Linuksa, sądzę, że dzieje się tak, ponieważ tak duża część pozostałej części użytkownika pochodzi również z projektu GNU . Bash jest również nieco bardziej zaawansowany niżpdksh
, ponieważ programiści Bash nie ograniczają się do kopiowania funkcji powłoki Korna.Prace
pdksh
zakończyły się w momencie, gdy AT&T wydało kod źródłowy do prawdziwej powłoki Korna. Istnieją dwa główne widły, które nadal są utrzymywane, jednak: OpenBSDpdksh
i MirBSD Korn Shellmksh
.Uważam za interesujące, że
mksh
jest to jedyna implementacja powłoki Korna obecnie pakowana dla Cygwin.GNU Bash wykracza poza POSIX na wiele sposobów, ale możesz poprosić go o uruchomienie w czystszym trybie POSIX .
csh
/tcsh
był zwykle domyślną interaktywną powłoką w systemach uniksowych BSD na początku lat 90.Będąc wariantem BSD , wczesne wersje Mac OS X były takie, poprzez Mac OS X 10.2 „Jaguar” . OS X zmienił domyślną powłokę
tcsh
na Bash w OS X 10.3 „Panther” . Ta zmiana nie wpłynęła na systemy zaktualizowane z wersji 10.2 lub wcześniejszej. Obecni użytkownicy w tych skonwertowanych systemach zachowalitcsh
powłokę.FreeBSD twierdzi, że nadal używa
tcsh
jako domyślnej powłoki , ale na maszynie wirtualnej FreeBSD 10, którą tu mam, domyślna powłoka wydaje się być jedną z odmian powłoki Almquist kompatybilnych z POSIX . Dotyczy to również NetBSD.OpenBSD używa
pdksh
zamiast tego rozwidlenia jako domyślnej powłoki.Większa popularność Linuksa i OS X sprawia, że niektórzy ludzie żałują, że FreeBSD nie zmieni się również na Bash, ale nie zrobią tego w najbliższym czasie z powodów filozoficznych . Jest łatwo je przełączać , jeśli to przeszkadza.
Obecnie rzadko można znaleźć system z prawdziwie waniliową powłoką Bourne'a
/bin/sh
. Musisz zrobić wszystko, aby znaleźć coś wystarczająco blisko do testowania zgodności.Znam tylko jeden sposób na uruchomienie oryginalnej powłoki Bourne'a z 1979 roku na nowoczesnym komputerze: użyj obrazów dysku Ancient Unix V7 z symulatorem SIMH PDP-11 z Computer History Simulation Project . SIMH działa na prawie każdym nowoczesnym komputerze , nie tylko na Uniksie. SIMH działa nawet na Androidzie i iOS .
W przypadku OpenSolaris firma Sun po raz pierwszy zakupiła wersję SVR4 powłoki Bourne'a. Wcześniej kod źródłowy wersji Bourne'a po wersji V7 był dostępny tylko dla osób posiadających licencję na kod źródłowy w systemie Unix.
Ten kod jest teraz dostępny osobno od reszty nieistniejącego projektu OpenSolaris z kilku różnych źródeł.
Najbardziej bezpośrednim źródłem jest projekt powłoki Heirloom Bourne . Stało się to dostępne wkrótce po wydaniu OpenSolaris w 2005 roku. W ciągu następnych kilku miesięcy wykonano prace związane z przenoszeniem i naprawą błędów, ale prace nad projektem zostały wstrzymane.
Jörg Schilling wykonał lepszą robotę, utrzymując wersję tego kodu, tak jak
osh
w swoim pakiecie Schily Tools . Więcej informacji na ten temat znajduje się powyżej.Należy pamiętać, że te powłoki pochodzące z wydania kodu źródłowego 2005 zawierają wielobajtową obsługę zestawu znaków , kontrolę zadań, funkcje powłoki i inne funkcje nieobecne w oryginalnej powłoce Bourne'a z 1979 roku.
Jednym ze sposobów stwierdzenia, czy korzystasz z oryginalnej powłoki Bourne'a, jest sprawdzenie, czy obsługuje ona dodaną nieudokumentowaną funkcję ułatwiającą przejście z powłoki Thompson:
^
jako alias|
. To znaczy, że polecenie takiels ^ more
spowoduje błąd w powłoce typu Korna lub POSIX, ale będzie zachowywać się jakls | more
w prawdziwej powłoce Bourne'a.Czasami napotkasz
fish
,scsh
lubrc/es
przylegające, ale są jeszcze rzadsze niż fanów powłoki C.rc
Rodzina muszli nie jest powszechnie stosowany w systemach Unix / Linux, ale rodzina jest historycznie ważne, co jest, jak to zdobył miejsce w powyższym schemacie.rc
jest standardową powłoką systemu Plan 9 z systemu operacyjnego Bell Labs , swego rodzaju następcą dziesiątej edycji systemu Unix , utworzonego w ramach ciągłych badań Bell Labs nad projektowaniem systemu operacyjnego. Jest to niezgodne zarówno z powłoką Bourne'a, jak i C na poziomie programowania; prawdopodobnie jest tam lekcja.Najbardziej aktywnym wariantem
rc
wydaje się być ten utrzymywany przez Toby'ego Goodwina , który jest oparty narc
klonie Uniksa autorstwa Byrona Rakitzisa.źródło
„sh zgodny” odnosi się do POSIX
sh
, podstawowej powłoki, która musi istnieć we wszystkich kompatybilnych systemach. Skrypt zgodny z SH powinien działać na każdym komputerze zgodnym z POSIX.Powodem jest to konieczne, aby powiedzieć, że jest tak powszechnie
/bin/sh
jest dowiązaniem do/bin/bash
, który pozwolił niektóre Bashisms wsunąć do skryptów, które deklarują się korzystaćsh
z#!/bin/sh
. Te skrypty nie działają w systemach, które nie używająbash
jako/bin/sh
, w tym niektórych komercyjnych Unices na zawsze, a ostatnio w Debianie i pochodnych .W szczególności ostatnio
dash
używano powłoki Debian Almquish Shellsh
, ponieważ jest ona mniejsza i ma być szybsza. Trend ten uwypuklił wiele tych baszizmów, które były w rzekomychsh
skryptach. Opisanie czegoś jako „kompatybilnego z sh” oznacza, że jest wyraźnie przeznaczony do pracy z tymi systemami, pozostając całkowicie w języku określonym przez POSIX - wszystkie powłoki implementują nadzbiór tej funkcjonalności, więc gwarantuje się, że będzie działać wszędzie, ale ich rozszerzenia nie są kompatybilne ze sobą.Różne powłoki mają swoją własną historię rozwoju i z czasem ulegały rozbieżności w różnych kierunkach, ponieważ dodawały funkcje pomagające użytkownikom w interaktywnym użytkowaniu lub rozszerzenia skryptów, takie jak tablice asocjacyjne. Skrypt „sh-niekompatybilny” używałby niektórych z tych niestandardowych funkcji rozszerzenia, takich jak
[[
warunki warunkowe Basha .Funkcje inne niż POSIX w
bash
itcsh
orazzsh
wszystkie inne bieżące powłoki są przydatne i istnieje wiele okazji, w których możesz ich potrzebować lub potrzebować. Po prostu nie należy ich używać w skrypcie, który deklaruje się do pracy/bin/sh
, ponieważ nie można polegać na tym, że te funkcje znajdują się w podstawowejsh
implementacji systemu, na którym działa.Skrypt, który musi użyć, powiedzmy, tablice asocjacyjne, należy upewnić się, że prowadzony z
bash
raczej niżsh
:To będzie działać wszędzie
bash
. Skrypty, które nie potrzebują rozszerzonej funkcjonalności i mają być przenośne, powinny zadeklarować, że używająsh
i trzymają się podstawowego języka poleceń powłoki.źródło