GNU/Linux >> Znalost Linux >  >> Linux

Co to znamená být „sh Compatible“?

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/sh zů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é ash rozvětvení mimo svět BSD:

    1. dash , skvěle přijatý Debianem a Ubuntu v roce 2006 jako výchozí /bin/sh implementace. (Bash zůstává výchozí interaktivní příkazový shell v derivátech Debianu.)

    2. ash příkaz v BusyBox, který se často používá v embedded Linuxech a lze jej použít k implementaci /bin/sh . Protože je po datu dash a byl odvozen ze starého Debianu ash balíček, rozhodl jsem se jej považovat za derivát dash spíše než ash , navzdory jeho názvu příkazu v BusyBox.

      (BusyBox také obsahuje méně funkční alternativu k ash s názvem hush . Obvykle bude do libovolného binárního souboru BusyBox zabudován pouze jeden z těchto dvou:ash ve výchozím nastavení, ale hush když je místa opravdu málo. Tedy /bin/sh na systémech založených na BusyBox není vždy dash -jako.)

  • GNU Bash , která při volání jako sh deaktivuje 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 ksh93 POSIX 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 jako sh , 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 ksh93 funkce 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í:

  1. Odkazují na jednu z těch „jiných“ skořápek.⁹

  2. Dělají rozdíl mezi rodinami Bourne a C shellů.

  3. 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 , bash a zsh mají 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/ksh88 zá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 checkbashisms na 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 obosh z 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 , zsh a vylepšené verze ksh93 .

    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 :

  1. 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.

  2. 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 , switch a while ) 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.

  3. 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.

  4. 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 ksh v 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, ksh rozvětvený do dvou hlavních verzí:ksh88 a ksh93 , pojmenované po letech spojených s jejich rozchodem.

    ksh88 není zcela kompatibilní s POSIX, i když rozdíly jsou malé, takže některé verze ksh88 shell 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.)

    ksh93 je plně kompatibilní superset POSIX shellu. Vývoj na ksh93 byl 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á ksh93 s 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 ksh nebo Korn shell podle jména, mluvíme o ksh93 funkce, které jej odlišují od jeho zpětně kompatibilních podmnožin shellů Bourne a POSIX. Jen zřídka narazíte na čistý ksh88 dnes.

  5. 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 ksh93 kaž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 pdksh zastavil 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:OpenBSD pdksh a MirBSD Korn Shell, mksh .

    Připadá mi zajímavé, že mksh je jedinou implementací shellu Korn aktuálně zabalenou pro Cygwin.

  6. GNU Bash v mnoha ohledech přesahuje POSIX, ale můžete jej požádat, aby běžel v čistějším režimu POSIX.

  7. csh /tcsh byl 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 tcsh na 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ůj tcsh shell.

    FreeBSD tvrdí, že stále používá tcsh jako 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 pdksh mí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í.

  8. Je vzácné najít systém se skutečně vanilkovým Bourne shellem jako /bin/sh tyto 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 obosh v 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 jako ls ^ more vydá chybu na shellu typu Korn nebo POSIX, ale bude se chovat jako ls | more na skutečné Bourne shell.

  9. Občas narazíte na fish , scsh nebo rc/es přívrženci, ale jsou ještě vzácnější než fanoušci shellu C.

    rc rodina 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. rc je 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 rc Zdá se, že je to ten, který spravuje Toby Goodwin a který je založen na unixovém rc klon od Byrona Rakitzise.

Související:Extrahovat soubor z obrazu dockeru?
Linux
  1. Co znamená syntaxe |&v jazyce shellu?

  2. Co to znamená #define X X?

  3. Co dělá % v řetězcích shellu Linux?

  1. Co znamená `:-` ve skriptu Shell?

  2. Co znamená Ampersand na konci řádku skriptu Shell?

  3. Co znamená schopnost ep?

  1. Co znamená ve výstupu Ps?

  2. Co toto varování znamená?

  3. Co znamená [email protected] ve skriptu shellu?