Viděl jsem frázi „sh compatible“ používanou obvykle v odkazu na shelly. Nejsem si jistý, zda se to vztahuje i na programy, které lze spouštět z prostředí shellů.
Co to znamená pro shell nebo jiný program, aby byl „sh kompatibilní“? Co by znamenalo být „nekompatibilní“?
Edit:
Tato otázka, která se ptá na rozdíl mezi bash a sh, je velmi relevantní:
Rozdíl mezi sh a bash
Stále bych chtěl přímou odpověď na to, co to znamená být „sh kompatibilní“. Rozumným očekáváním by mohlo být, že „sh compatible“ znamená „implementuje Shell Command Language“, ale proč tedy existuje tolik „sh kompatibilních“ shellů a proč se liší?
Přijatá odpověď:
Proč existuje tolik „sh kompatibilních“ shellů?
Bourne shell byl poprvé veřejně vydán v roce 1979 jako součást Unixu V7. Vzhledem k tomu, že téměř každý Unix a Unixu podobný systém pochází z V7 Unixu – i když pouze duchovně – Bourneův shell je tu s námi „navždy“.¹
Bourne shell ve skutečnosti nahradil dřívější shell, retronymně označovaný jako Thompson shell, ale stalo se to tak brzy v historii Unixu, že je dnes téměř zapomenuto. Bourne shell je nadmnožinou Thompson shell.²
Bourneův i Thompsonův náboj se jmenovaly sh . Shell specifikovaný POSIXem se také nazývá sh . Takže, když někdo řekne sh -kompatibilní, ručně odkazují na tuto sérii granátů. Pokud by chtěli být konkrétní, řekli by „POSIX shell“ nebo „Bourne shell“.³
Shell POSIX je založen na verzi KornShell z roku 1988, která měla nahradit Bourne shell na AT&T Unix, čímž přeskočila shell BSD C z hlediska funkcí.⁴ Do té míry, že ksh je předchůdcem shellu POSIX, většina unixových a unixových systémů dnes obsahuje nějakou variantu shellu Korn. Výjimkou jsou obecně malé vestavěné systémy, které si nemohou dovolit prostor, který zabírá celý POSIX shell.
To znamená, že shell Korn – jako věc odlišná od shellu POSIX – se nikdy ve skutečnosti nestal populárním mimo komerční svět Unixu. Je to proto, že jeho vzestup korespondoval s prvními lety komercializace Unixu, takže se dostal do unixových válek. BSD Unixes se toho vyvaroval ve prospěch shellu C a jeho zdrojový kód nebyl volně dostupný pro použití v Linuxu, když začínal.⁵ Když tedy první distributoři Linuxu hledali příkazový shell, který by šel s jejich linuxovým jádrem, obvykle zvolili GNU Bash, jeden z těch sh -kompatibilní, o kterých mluvíte.⁶
Toto rané spojení mezi Linuxem a Bashem do značné míry zpečetilo osud mnoha dalších shellů, včetně ksh , csh a tcsh . Existují zarytí, kteří tyto granáty stále používají, ale jsou velmi v menšině.⁷
Celá tato historie vysvětluje, proč mají tvůrci relativních opozdilců rádi bash , zsh a yash zvolili, aby byly sh -kompatibilní:Bourne/POSIX kompatibilita je minimum, které musí shell pro unixové systémy poskytnout, aby získaly široké přijetí.
V mnoha systémech je výchozí interaktivní příkazový shell a /bin/sh jsou různé věci. /bin/sh může být:
-
Původní Bourne shell. To je běžné u starších systémů UNIX®, jako je Solaris 10 (vydaný v roce 2005) a jeho předchůdci.⁸
-
Skořápka s certifikací POSIX. To je běžné u novějších systémů UNIX®, jako je Solaris 11 (2010).
-
Skořápka Almquist . Toto je open source klon Bourne/POSIX shell původně vydaný na Usenetu v roce 1989, který byl poté přidán do Berkeley's CSRG pro zahrnutí do prvního vydání BSD neobsahujícího žádný zdrojový kód AT&T, 4.4BSD-Lite. Almquist shell je často nazýván
ash, i když je nainstalován jako/bin/sh.4.4BSD-Lite se zase stal základem pro všechny moderní deriváty BSD s
/bin/shzůstat ve většině z nich jako derivát Almquista, s jednou hlavní výjimkou uvedenou níže. Toto přímé potomstvo můžete vidět v úložištích zdrojového kódu pro NetBSD a FreeBSD:od 1. dne dodávali derivát Almquist shell.Existují dva důležité
ashrozvětvení mimo svět BSD:-
dash, skvěle přijatý Debianem a Ubuntu v roce 2006 jako výchozí/bin/shimplementace. (Bash zůstává výchozí interaktivní příkazový shell v derivátech Debianu.) -
ashpříkaz v BusyBox, který se často používá v embedded Linuxech a lze jej použít k implementaci/bin/sh. Protože je po datudasha byl odvozen ze starého Debianuashbalíček, rozhodl jsem se jej považovat za derivátdashspíše nežash, navzdory jeho názvu příkazu v BusyBox.(BusyBox také obsahuje méně funkční alternativu k
ashs názvemhush. Obvykle bude do libovolného binárního souboru BusyBox zabudován pouze jeden z těchto dvou:ashve výchozím nastavení, alehushkdyž je místa opravdu málo. Tedy/bin/shna systémech založených na BusyBox není vždydash-jako.)
-
-
GNU Bash , která při volání jako
shdeaktivuje většinu svých ne-POSIXových rozšíření .Tato volba je typická pro desktopové a serverové varianty Linuxu, s výjimkou Debianu a jeho derivátů. Mac OS X to také dělá od Panthera, vydaného v roce 2003.
-
Skořápka s
ksh93POSIX rozšíření , jako v OpenBSD. Ačkoli Shell OpenBSD mění chování, aby se vyhnul syntaxi a sémantickým nekompatibilitám s Bourne a POSIX shelly, když je volán jakosh, nedeaktivuje žádná ze svých čistých rozšíření, pokud nejsou v konfliktu se staršími shelly.To není běžné; neměli byste očekávat
ksh93funkce v/bin/sh.
Výše jsem použil „shell script“ jako obecný termín znamenající Bourne/POSIX shell skriptování. To je způsobeno všudypřítomností lastur rodiny Bourne. Chcete-li mluvit o skriptování v jiných shellech, musíte zadat kvalifikátor, například „C shell skript“. Dokonce i na systémech, kde je výchozím interaktivním shellem shell rodiny C, je lepší používat pro skriptování Bourne shell.
Je výmluvné, že když Wikipedia klasifikuje unixové shelly, seskupí je do Bourne shell kompatibilní, C shell kompatibilní a „ostatní“.
Související:Uživatelsky přívětivý příkaz k zobrazení seznamu všech uživatelů v systému Ubuntu?Tento diagram může pomoci:

(Kliknutím zobrazíte verzi SVG, 31 kB, nebo zobrazíte verzi PNG v plné velikosti, 218 kB.)
Co by znamenalo být „nekompatibilní“?
Někdo mluví o sh -nekompatibilní věc obvykle znamená jednu ze tří věcí:
-
Odkazují na jednu z těch „jiných“ skořápek.⁹
-
Dělají rozdíl mezi rodinami Bourne a C shellů.
-
Mluví o nějaké specifické funkci v jedné skořápce rodiny Bourne, která není ve všech ostatních skořápkách rodiny Bourne.
ksh93,bashazshmají zejména mnoho funkcí, které ve starších „standardních“ shellech neexistují. Tyto tři jsou také vzájemně nekompatibilní v mnoha ohledech, jakmile překročíte sdílený POSIX/ksh88základna.
Klasickou chybou je napsat shellový skript s #!/bin/sh Shebang line nahoře, ale chcete-li použít rozšíření shellu Bash nebo Korn. Od /bin/sh je jedním z shellů v diagramu rodiny Korn/POSIX výše na mnoha systémech v dnešní době, takové skripty budou fungovat na systému, na kterém jsou napsány, ale pak selžou na systémech, kde /bin/sh je něco z širší rodiny mušlí Bourne. Nejlepším postupem je použít #!/bin/bash nebo #!/bin/ksh shebang lines, pokud skript taková rozšíření používá.
Existuje mnoho způsobů, jak zkontrolovat, zda je daný skript prostředí Bourne rodiny přenosný:
-
Spusťte
checkbashismsna něm nástroj z projektu Debian, který kontroluje skript na „bashismy.“ -
Spusťte jej pod
posh, shell v úložišti balíčků Debian, který záměrně implementuje pouze funkce specifikované SUS3 a několik dalších menších funkcí. -
Spusťte jej pod
oboshz projektu Schily Tools, vylepšená verze Bourne shellu jako open source od Sunu jako součást OpenSolaris v roce 2005, což z něj dělá jeden z nejjednodušších způsobů, jak získat Bourne shell ve stylu 1979 na moderním počítači.Distribuce Schily Tools také obsahuje
bosh, shell typu POSIX s mnoha nestandardními funkcemi, který však může být užitečný pro testování kompatibility skriptů shellu určených ke spuštění na všech shellech rodiny POSIX. Ve své sadě funkcí bývá konzervativnější nežbash,zsha vylepšené verzeksh93.Schily Tools také obsahuje shell nazvaný
bsh, ale to je historická zvláštnost, která vůbec není skořápkou Bourneovy rodiny. -
Projděte si kapitolu Programování přenosného prostředí v příručce GNU Autoconf. Některé problematické konstrukce, o kterých mluví, možná poznáte ve svých skriptech.
Proč se liší?
Ze stejných důvodů všechny „Nové a vylepšené!“ věci jsou jiné:
-
Vylepšená verze by mohla být vylepšena pouze porušením zpětné kompatibility.
-
Někdo vymyslel jiný způsob, jak něco fungovat, co se mu líbí víc, ale který není stejný jako ten starý.
-
Někdo se pokusil reimplementovat starý standard, aniž by mu úplně rozuměl, takže to zpackal a vytvořil neúmyslný rozdíl.
Poznámky pod čarou a strany :
-
Rané verze BSD Unix byly pouze doplňkovými softwarovými kolekcemi pro V6 Unix. Protože Bourne shell nebyl přidán do AT&T Unix až do V7, BSD technicky nezačalo mít Bourne shell. Odpovědí BSD na primitivní povahu Thompsonova shellu byl C shell.
Nicméně první samostatné verze BSD (2.9BSD a 3BSD) byly založeny na V7 nebo jeho přenosném nástupci UNIX/32V, takže byly zahrnout Bourne shell.
(Řada 2BSD se proměnila v paralelní větev BSD pro minipočítače PDP společnosti Digital, zatímco řady 3BSD a 4BSD pokračovaly ve využívání výhod novějších typů počítačů, jako jsou pracovní stanice Vaxen a Unix. 2.9BSD byla v podstatě PDP verze 4.1cBSD; současný a sdílený kód. PDP nezmizely jen tak, když dorazil VAX, takže řada 2BSD se stále hroutí.)
Dá se s jistotou říci, že Bourneův shell byl v roce 1983 všude ve světě Unixu. To je dobré přiblížení „navždy“ v počítačovém průmyslu. MS-DOS dostal ten rok hierarchický souborový systém (awww, jak roztomilý!) a první 24bitový Macintosh s 9″ černobílou obrazovkou – nikoli ve stupních šedi, doslova černý a bílá — nevyjde dříve než na začátku příštího roku.
-
Thompsonův plášť byl podle dnešních standardů docela primitivní. Byl to pouze interaktivní příkazový shell, spíše než prostředí pro programování skriptů, které dnes očekáváme. Měl věci jako roury a přesměrování I/O, které považujeme za prototypickou součást „unixového shellu“, takže příkazový shell MS-DOS považujeme za získání z Unixu.
Bourne shell také nahradil PWB shell, který přidal důležité věci do Thompson shellu, jako je programovatelnost (
if,switchawhile) a raná forma proměnných prostředí. Shell PWB je ještě méně dobře zapamatovatelný než shell Thompson, protože nebyl součástí každé verze Unixu. -
Když někdo není Pokud jde o kompatibilitu shellu POSIX vs Bourne, existuje celá řada věcí, které mohou znamenat.
V jednom extrému by mohli jako základní linii používat granát z Bourne z roku 1979. „
sh-kompatibilní skript“ v tomto smyslu by znamenalo, že se očekává, že bude perfektně fungovat na skutečném Bourne shellu nebo na kterémkoli z jeho nástupců a klonů:ash,bash,ksh,zsh, atd.Někdo na druhém extrému místo toho předpokládá shell určený POSIXem jako základní linii. V dnešní době bereme tolik funkcí shellu POSIX jako „standard“, že často zapomínáme, že v Bourne shellu ve skutečnosti nebyly:vestavěná aritmetika, řízení úloh, historie příkazů, aliasy, úpravy příkazového řádku,
$()forma substituce příkazů atd. -
Ačkoli Korn shell má kořeny sahající až do počátku 80. let, AT&T jej dodalo v Unixu až po System V Release 4 v roce 1988. Protože tolik komerčních Unixů je založeno na SVR4, klade to
kshv téměř každém relevantním komerčním Unixu od konce 80. let 20. století.(Několik podivných unixových příchutí založených na SVR3 a dřívějších se udrželo na trhu i po vydání SVR4, ale když přišla revoluce, byly první proti zdi.)
Rok 1988 je také rokem, kdy vyšel první standard POSIX se svým „POSIX shellem“ založeným na Korn shellu. Později, v roce 1993, vyšla vylepšená verze granátu Korn. Protože POSIX efektivně přibil originál na místo,
kshrozvětvený do dvou hlavních verzí:ksh88aksh93, pojmenované po letech spojených s jejich rozchodem.ksh88není zcela kompatibilní s POSIX, i když rozdíly jsou malé, takže některé verzeksh88shell byly opraveny tak, aby byly kompatibilní s POSIX. (Toto je ze zajímavého rozhovoru na Slashdot s Dr. Davidem G. Kornem. Ano, ten člověk, který napsal tu skořápku.)ksh93je plně kompatibilní superset POSIX shellu. Vývoj naksh93byl sporadický od doby, kdy se primární zdrojové úložiště přesunulo z AT&T na GitHub, přičemž nejnovější vydání je v době, kdy toto píšu, asi 3 roky staré, ksh93v. (Základní název projektu zůstáváksh93s příponami přidanými k označení verzí po roce 1993.)Systémy, které obsahují shell Korn jako samostatnou věc od shellu POSIX, jej obvykle zpřístupňují jako
/bin/ksh, i když se někdy skrývá jinde.Když mluvíme o
kshnebo Korn shell podle jména, mluvíme oksh93funkce, které jej odlišují od jeho zpětně kompatibilních podmnožin shellů Bourne a POSIX. Jen zřídka narazíte na čistýksh88dnes. -
AT&T ponechalo zdrojový kód shellu Korn proprietární až do března 2000. V té době bylo spojení Linuxu s GNU Bash velmi silné. Bash a
ksh93každý má výhody oproti druhému, ale v tomto bodě setrvačnost udržuje Linux těsně spojený s Bash.O tom, proč první výrobci Linuxu nejčastěji volí GNU Bash před
pdksh, což bylo dostupný v době, kdy Linux začínal, hádal bych, že je to proto, že velká část zbytku uživatelského prostoru také pocházela z projektu GNU. Bash je také o něco pokročilejší nežpdksh, protože vývojáři Bash se neomezují pouze na kopírování funkcí shellu Korn.Pracujte na
pdkshzastavil se v době, kdy AT&T uvolnil zdrojový kód skutečného shellu Korn. Existují však dvě hlavní větve, které jsou stále udržovány:OpenBSDpdksha MirBSD Korn Shell,mksh.Připadá mi zajímavé, že
mkshje jedinou implementací shellu Korn aktuálně zabalenou pro Cygwin. -
GNU Bash v mnoha ohledech přesahuje POSIX, ale můžete jej požádat, aby běžel v čistějším režimu POSIX.
-
csh/tcshbyl obvykle výchozí interaktivní shell na BSD Unixech až do počátku 90. let.Protože se jedná o variantu BSD, rané verze Mac OS X byly tímto způsobem, přes Mac OS X 10.2 „Jaguar“. OS X přepnul výchozí shell z
tcshna Bash v OS X 10.3 „Panther“. Tato změna neovlivnila systémy upgradované z verze 10.2 nebo dřívější. Stávající uživatelé na těchto převedených systémech si ponechali svůjtcshshell.FreeBSD tvrdí, že stále používá
tcshjako výchozí shell, ale na FreeBSD 10 VM, který zde mám, se zdá, že výchozí shell je jedna z variant Almquist shellu kompatibilní s POSIXem. To platí i pro NetBSD.OpenBSD používá větev
pdkshmísto toho jako výchozí shell.Vyšší popularita Linuxu a OS X vyvolává u některých lidí přání, aby FreeBSD také přešlo na Bash, ale z filozofických důvodů tak brzy neudělají. Je snadné jej přepnout, pokud vám to vadí.
-
Je vzácné najít systém se skutečně vanilkovým Bourne shellem jako
/bin/shtyto dny. Musíte se ze všech sil snažit najít něco, co je dostatečně blízko k testování kompatibility.Jsem si vědom pouze jednoho způsobu, jak spustit originální Bourne shell z roku 1979 na moderním počítači:použít obrazy disku Ancient Unix V7 se simulátorem SIMH PDP-11 z projektu Computer History Simulation Project. SIMH běží na téměř každém moderním počítači, nejen na těch unixových. SIMH dokonce běží na Androidu a iOS.
S OpenSolaris Sun poprvé otevřel verzi Bourne shellu SVR4. Předtím byl zdrojový kód pro verze Bourne shellu po V7 k dispozici pouze uživatelům s licencí na zdrojový kód Unix.
Tento kód je nyní k dispozici odděleně od zbytku zaniklého projektu OpenSolaris z několika různých zdrojů.
Nejpřímějším zdrojem je projekt Heirloom Bourne shell. To se stalo dostupným krátce po původním vydání OpenSolaris z roku 2005. Během několika příštích měsíců byla provedena určitá práce na přenositelnosti a opravě chyb, ale pak se vývoj projektu zastavil.
Jörg Schilling odvedl lepší práci při udržování verze tohoto kódu jako
oboshv jeho balíčku Schily Tools. Více o tom viz výše.Mějte na paměti, že tyto shelly odvozené z vydání zdrojového kódu z roku 2005 obsahují podporu vícebajtových znakových sad, řízení úloh, funkce shellu a další funkce, které původní Bourne shell z roku 1979 nenabízí.
Jedním ze způsobů, jak zjistit, zda používáte původní Bourne shell, je zjistit, zda podporuje nezdokumentovanou funkci přidanou pro usnadnění přechodu z prostředí Thompson:
^jako alias pro|. To znamená příkaz jakols ^ morevydá chybu na shellu typu Korn nebo POSIX, ale bude se chovat jakols | morena skutečné Bourne shell. -
Občas narazíte na
fish,scshneborc/espřívrženci, ale jsou ještě vzácnější než fanoušci shellu C.rcrodina shellů se na systémech Unix/Linux běžně nepoužívá, ale rodina je historicky důležitá, a proto si získala místo ve výše uvedeném diagramu.rcje standardní shell operačního systému Plan 9 od Bell Labs, jakýsi nástupce 10. edice Unix, vytvořený jako součást pokračujícího výzkumu Bell Labs v oblasti návrhu operačního systému. Je nekompatibilní s Bourne a C shell na programovací úrovni; pravděpodobně z toho plyne poučení.Nejaktivnější varianta
rcZdá se, že je to ten, který spravuje Toby Goodwin a který je založen na unixovémrcklon od Byrona Rakitzise.