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, žesh
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
nebodash
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 ' cestush
. Většina mušlí (aexecp
/env
/find -exec...
) bude interpretovat she-bang- méně skriptu se systémem ' ssh
, 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.
/bin/bash
rozhodně není FreeBSD (bude be/usr/local/bin/bash
protože bash není součástí výchozích skořápek)./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.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).