Kommentarer
- Det handler egentlig om hvor bærbar du vil være . Bare Unixes? Alle Linux-kjernebaserte bokser? Alle systemer til og med gamle Win 3.0 og VMS (tuller)?
/bin/sh
er vanligvis et godt minimum, bare vær oppmerksom på atsh
ikke erbash
.. forvent på de fleste GNU / Linux -systemer. - Selv om Android bruker linux-kjernen og standardskallet er avledet fra bash via aske, er brukerlandet ikke veldig unix-aktig og mangler mange standardverktøy.
Svar
For bærbarhet kan du trygt anta at #!/bin/sh
vil finne et stort sett POSIX-kompatibelt skall på ethvert standard Unix- eller Linux-system, men det handler egentlig om det.
I FreeBSD, OpenBSD og NetBSD ( sammen med DragonFly, PC-BSD og noen andre derivater) ligger bash på /usr/local/bin/bash
(hvis den er installert), så /usr/bin/env
tilnærming gir bærbarhet mellom Linux og BSD.
Android er ikke et standard Unix- eller Linux-system. På min ikke-rotte Android-telefon er ingen av /usr/bin/env
, /bin/bash
o selv /bin/sh
eksisterer, og systemskallet er /system/bin/sh
.
Et skallskript som mangler #!
(shebang) vil prøve å kjøre i skallet som kalte det på noen systemer, eller kan bruke en annen standardtolk (for eksempel /bin/bash
) , på andre systemer. Og selv om dette fungerer i Android, fungerer det ikke garantert i andre operativsystemer, der brukere kan velge å bruke et interaktivt skall som ikke er bash
. (Jeg bruker tcsh i FreeBSD, hvor det er standardskallet, og shebang-mindre skript tolkes av det kallende skallet.)
Så fra hvor jeg sitter ser det ut som det er ikke mulig å lage et skallskript som er bærbart mellom Android- og ikke-Android-systemer (Linux eller Unix), fordi Android gjør ting annerledes.
Kommentarer
- Etter min erfaring skal
/bin/sh
peke på noe mer sombsh
ellerdash
ennbash
, som er relativt oppblåst og dermed foretrukket for interaktiv bruk. - Noen få feil her inne. Det er fortsatt mange (for det meste kommersielle) Enheter her (de fleste av dem Solaris 10 og før) der
/bin/sh
er Bourne Shel l, ikke et POSIX-skall, POSIX spesifiserer ikke ' t banen tilsh
. De fleste skjell (ogexecp
/env
/find -exec...
) vil tolke en she-bang- mindre skript med systemet ' ssh
, få tolker det med seg selv, og når de gjør det, gjør de det i POSIX-kompatibilitetsmodus. At ' er standard / POSIX-måten å kjøre skript på, men det antar at den som ringer er i et POSIX-miljø . - Angående * BSD
bash
er valgfritt. Det betyr at det er gode sjanser for at selv/usr/local/bin/bash
ikke eksisterer på systemene (for ikke å nevne proprietære systemer som Solaris, AIX eller HP-Ux). - @ StephaneChazelas – re POSIX, jeg er selvfølgelig enig, og at ' er hvorfor ordene jeg brukte var " for det meste POSIX-kompatible ". Men dette spørsmålet handlet om bærbarhet, snarere enn hvor man finner POSIX, og man kan ' ikke stole på at et skall alltid blir funnet på ett sted. Når det gjelder standardtolk, blir et shebang-mindre skript som kjøres i tcsh tolket av tcsh på FreeBSD. Det er tydeligvis ' s inkonsekvens der også, så jeg ' har oppdatert svaret tilsvarende.
- @Ouki – ja selvfølgelig, jeg tenkte bare ikke ' det var relevant for spørsmålet. Men jeg ' har lagt til den avklaringen til svaret for tydelighetens skyld.
Svar
Etter min erfaring har #!/bin/sh
og #!/bin/bash
alltid endt opp med å finne det rette miljøet på de få systemene jeg har jobbet med . Jeg skal ennå møte et unntak. Jeg synes også det blir brukt rutinemessig i shell scripting-relaterte tekster som jeg antar er skrevet med tanke på bærbarhet på grunn av mangfoldig publikum.
Kan ikke si det samme med #!/usr/bin/env
.Noen systemer har den installert som #!/bin/env
og har ødelagt python-skriptene mine tidligere. Så, jeg vil gå med den andre kula.
Her er noen støtte for utsagnet mitt ovenfor:
På CentOS utgivelse 5.7 får jeg følgende:
$ which env /bin/env
På Ubuntu 12.04 Presis Pangolin:
$ which env /usr/bin/env
I tillegg, i det minste i ett eldre system, husker jeg administratorene installert coreutils
på /opt
av en eller annen grunn (kan ikke være en god praksis). Siden env
er en del av coreutils
, brukerne endte med å få det til /opt/coreutils/bin/env
. Riktignok har jeg ikke brukt alle systemene der ute, så svaret er basert på min begrensede erfaring.
/bin/bash
definitivt ikke FreeBSD (ville vær/usr/local/bin/bash
da bash ikke er en del av standardskjellene./usr/bin/env
(SCO som er barel y eksisterende, NextStep som er alt annet enn utryddet – pluss selvfølgelig de vanligste ikke-unix-systemene som Android eller Windows). På den annen side eksisterer/bin/bash
stort sett bare på ikke-innebygd Linux./bin/sh
er et sikkert spill på alle unix, men noen eldre systemer har et ikke-POSIX Bourne-skall der.which env
isn ' t relevant: det er ganske mange systemer der/usr/bin
er en symlink til/bin
eller omvendt, noe som gjør begge/usr/bin/env
og/bin/env
kan brukes. Det som betyr noe er at/usr/bin/env
er til stede, noe som er tilfelle på alle Linux-distribusjoner jeg ' noensinne har sett eller hørt om (og fjernet det ville ødelegge så mange ting at ingen ville gjøre det).