záhlaví shellového skriptu pro nejlepší kompatibilitu [duplikát]

Tato otázka již má odpovědi zde :

Komentáře

  • Je to opravdu o tom, jak přenosný chcete být . Pouze Unixes? Všechny boxy založené na Linuxu? Všechny systémy, dokonce i staré Win 3.0 a VMS (srandu)? /bin/sh je obvykle dobré minimum, mějte však na paměti, že sh není bash .. . očekávejte na většině systémů GNU / Linux .
  • Ačkoli Android používá linuxové jádro a výchozí prostředí je odvozeno z bash přes ash, uživatelská země není velmi podobné unixu a chybí mnoho standardních nástrojů.

Odpověď

Z důvodu přenositelnosti můžete bezpečně předpokládat, že #!/bin/sh najde na většině standardních unixových nebo linuxových systémech prostředí většinou vyhovující standardu POSIX, ale o tom to opravdu je.

Ve FreeBSD, OpenBSD a NetBSD ( spolu s DragonFly, PC-BSD a některými dalšími deriváty) je bash umístěn na /usr/local/bin/bash (pokud je nainstalován), takže /usr/bin/env Tento přístup poskytuje přenositelnost mezi Linuxem a BSD.

Android není standardní systém Unix nebo Linux. Na mém telefonu Android bez root není žádný z /usr/bin/env, /bin/bash o r dokonce /bin/sh existují a systémový shell je /system/bin/sh.

V shellovém skriptu chybí #! (shebang) se pokusí spustit v prostředí, které jej v některých systémech volalo, nebo může použít jiného výchozího tlumočníka (například /bin/bash) , na jiných systémech. Ačkoliv toto může fungovat v systému Android, není zaručeno, že bude fungovat v jiných operačních systémech, kde se uživatelé mohou rozhodnout použít interaktivní prostředí, které není bash. (Používám tcsh ve FreeBSD, kde je to výchozí shell, a skript bez Shebangu je interpretován volajícím shellem.)

Takže z místa, kde sedím, to vypadá, že je není možné vytvořit shell skript, který je přenosný mezi systémy Android a jinými systémy než Android (Linux nebo Unix), protože Android dělá věci jinak.

Komentáře

  • Podle mých zkušeností má /bin/sh ukazovat na něco podobnějšího než bsh nebo dash než bash, který je relativně nafouklý, a proto je preferován pro interaktivní použití.
  • Zde je několik chyb. Stále jich je mnoho (většinou komerčních) Unices around here (most of them Solaris 10 and before) where /bin/sh is the Bourne shel l, nikoli POSIX shell, POSIX neurčuje ' cestu sh. Většina mušlí (a execp / env / find -exec...) bude interpretovat she-bang- méně skriptu se systémem ' s sh, málokdo jej interpretuje sám se sebou a když to udělá, udělá to v režimu kompatibility POSIX. To je ' standardní / POSIX způsob spouštění skriptu, ale předpokládá se, že volající je v prostředí POSIX .
  • Ohledně * BSD bash je volitelné. Znamená to, že existuje velká šance, že v systémech neexistuje ani /usr/local/bin/bash (nemluvě o proprietárních systémech jako Solaris, AIX nebo HP-Ux).
  • @ StephaneChazelas – re POSIX, samozřejmě souhlasím, a proto ' proto používaná slova byla " většinou kompatibilní s POSIX ". Ale tato otázka byla spíše o přenositelnosti než o tom, kde najít POSIX, a člověk se nemůže ' spoléhat na to, že shell bude vždy nalezen na jednom místě. Pokud jde o výchozího tlumočníka, skript bez Shebangu spuštěný v tcsh bude interpretován tcsh na FreeBSD. Je zřejmé, že i tam existuje ' nekonzistence, takže jsem ' odpovídajícím způsobem aktualizoval odpověď.
  • @Ouki – ano, samozřejmě, ' si nemyslím, že by to bylo relevantní k otázce. Ale ' jsem toto vysvětlení přidal k odpovědi kvůli jasnosti.

Odpověď

Podle mých zkušeností #!/bin/sh a #!/bin/bash vždy skončily nalezením správného prostředí na několika systémech, na kterých jsem pracoval . Ještě jsem nenarazil na výjimku. Také mi připadá, že se běžně používá v textech souvisejících se skriptováním, které jsou psány s ohledem na přenositelnost z důvodu různorodého publika.

Nemohu říci totéž s #!/usr/bin/env.Některé systémy ji mají nainstalovanou jako #!/bin/env a v minulosti porušily mé pythonovské skripty. Takže půjdu s druhou odrážkou.

Zde je podpora pro mé výše uvedené prohlášení:

Ve verzi CentOS 5.7 dostanu následující:

$ which env /bin/env 

V systému Ubuntu 12.04 Precise Pangolin:

$ which env /usr/bin/env 

Navíc si alespoň v jednom starším systému pamatuji administrátory nainstalován coreutils na /opt z nějakého důvodu (nemusí to být nejlepší postup). Protože env je součástí coreutils, uživatelé to nakonec dostali na /opt/coreutils/bin/env. Je pravda, že jsem tam nevyužil všechny systémy, takže odpověď je založen na mých omezených zkušenostech.

Komentáře

  • Například /bin/bash rozhodně není FreeBSD (bude be /usr/local/bin/bash protože bash není součástí výchozích skořápek).
  • Je to ' spíše naopak: pouze některým velmi vzácným systémům chybí /usr/bin/env (SCO, což je barel y existující, NextStep, který je téměř vyhynulý – plus samozřejmě nejběžnější systémy jiné než unix, jako je Android nebo Windows). Na druhou stranu /bin/bash do značné míry existuje pouze na Linuxu bez vestavění. /bin/sh je bezpečná sázka na jakýkoli unix, ale několik starších systémů tam má shell non-POSIX Bourne.
  • @Gilles Díky za informace. Aktualizoval jsem svou odpověď a poskytl nějaké důkazy o tom, co jsem viděl na některých systémech, na které jsem narazil.
  • which env isn ' t relevantní: existuje poměrně málo systémů, kde /usr/bin je symbolický odkaz na /bin nebo naopak, což činí /usr/bin/env a /bin/env použitelné. Důležité je, že je přítomen /usr/bin/env, což je případ všech linuxových distribucí, které jsem kdy ' viděl nebo slyšel (a jeho odstranění) rozbije tolik věcí, že by to nikdo neudělal).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *