Kommentarer
- Det handler virkelig om, hvor bærbar du vil være . Kun Unixes? Alle Linux-kerne baserede kasser? Alle systemer endda gamle Win 3.0 og VMS (kidding)?
/bin/sh
er normalt et godt minimum, bare vær opmærksom på, atsh
ikke erbash
.. forvent på de fleste GNU / Linux -systemer. - Selvom Android bruger linux-kernen, og standardskallen stammer fra bash via aske, er brugerlandet ikke meget unix-lignende og mangler mange standardværktøjer.
Svar
For bærbarhed kan du med sikkerhed antage, at #!/bin/sh
finder en overvejende POSIX-kompatibel shell på ethvert standard Unix- eller Linux-system, men det handler virkelig om det.
I FreeBSD, OpenBSD og NetBSD ( sammen med DragonFly, PC-BSD og nogle andre derivater) er bash placeret på /usr/local/bin/bash
(hvis den er installeret), så /usr/bin/env
tilgang giver bærbarhed mellem Linux og BSD.
Android er ikke et standard Unix- eller Linux-system. På min ikke-rodfæstede Android-telefon er ingen af /usr/bin/env
, /bin/bash
o r selv /bin/sh
findes, og systemskallen er /system/bin/sh
.
Et shell-script, der mangler #!
(shebang) vil forsøge at køre i den shell, der kaldte det på nogle systemer, eller kan bruge en anden standardtolk (f.eks. /bin/bash
) , på andre systemer. Og selvom dette muligvis fungerer i Android, er det ikke garanteret at arbejde i andre operativsystemer, hvor brugere kan vælge at bruge en interaktiv skal, der ikke er bash
. (Jeg bruger tcsh i FreeBSD, hvor det er standardskallen, og shebang-mindre script fortolkes af den kaldende shell.)
Så fra hvor jeg sidder, ser det ud til at det er ikke muligt at oprette et shell-script, der er bærbart mellem Android- og ikke-Android-systemer (Linux eller Unix), fordi Android gør tingene anderledes.
Kommentarer
- Efter min erfaring skal
/bin/sh
pege på noget mere sombsh
ellerdash
endbash
, som er relativt oppustet og derfor foretrukket til interaktiv brug. - Et par fejl herinde. Der er stadig mange (for det meste kommercielle) Enheder her omkring (de fleste af dem Solaris 10 og før) hvor
/bin/sh
er Bourne Shel l, ikke en POSIX-skal, POSIX specificerer ikke ' t stien tilsh
. De fleste skaller (ogexecp
/env
/find -exec...
) fortolker et she-bang- mindre script med systemet ' ssh
, få fortolker det med sig selv, og når de gør det, gør de det i POSIX-kompatibilitetstilstand. At ' er standard / POSIX-måde at køre script på, men det forudsætter, at den, der ringer op, er i et POSIX-miljø . - Med hensyn til * BSD
bash
er valgfri. Det betyder, at der er gode chancer for, at selv/usr/local/bin/bash
ikke findes på systemerne (for ikke at nævne proprietære systemer som Solaris, AIX eller HP-Ux). - @ StephaneChazelas – re POSIX, jeg er selvfølgelig enig i, og at ' s hvorfor ordene jeg brugte var " mest POSIX-kompatible ". Men dette spørgsmål handlede om bærbarhed snarere end hvor man kunne finde POSIX, og man kan ' ikke stole på, at en skal altid findes et sted. Med hensyn til standardtolk fortolkes et shebang-mindre script, der køres i tcsh, af tcsh på FreeBSD. Der er selvfølgelig ' inkonsekvens der også, så jeg ' har opdateret svaret i overensstemmelse hermed.
- @Ouki – ja selvfølgelig, jeg troede bare ikke ' det var relevant for spørgsmålet. Men jeg ' har tilføjet denne afklaring til svaret for klarhedens skyld.
Svar
Efter min erfaring har #!/bin/sh
og #!/bin/bash
altid ender med at finde det rigtige miljø på de få systemer, jeg har arbejdet med . Jeg er endnu ikke stødt på en undtagelse. Jeg finder det også bruges rutinemæssigt i shell scripting-relaterede tekster, som jeg formoder er skrevet med tanke på bærbarhed på grund af forskelligartet publikum.
Kan ikke sige det samme med #!/usr/bin/env
.Nogle systemer har det installeret som #!/bin/env
og har tidligere brudt mine python-scripts. Så jeg går med den anden kugle.
Her er nogle understøttende for min ovenstående udsagn:
Ved CentOS release 5.7 får jeg følgende:
$ which env /bin/env
På Ubuntu 12.04 Præcis Pangolin:
$ which env /usr/bin/env
Derudover kan jeg i det mindste i et ældre system huske administratorerne installeret coreutils
på /opt
af en eller anden grund (kan ikke være en god praksis). Da env
er en del af coreutils
, brugerne endte med at få det til /opt/coreutils/bin/env
. Ganske vist har jeg ikke brugt alle systemer derude, så svaret er baseret på min begrænsede erfaring.
/bin/bash
bestemt ikke FreeBSD (ville være/usr/local/bin/bash
da bash ikke er en del af standardskaller)./usr/bin/env
(SCO som er barel y eksisterende, NextStep, som alt andet end er uddød – plus selvfølgelig de mest almindelige ikke-unix-systemer som Android eller Windows). På den anden side findes/bin/bash
stort set kun på ikke-integreret Linux./bin/sh
er et sikkert spil på enhver unix, men et par ældre systemer har en ikke-POSIX Bourne-skal der.which env
isn ' t relevant: der er en hel del systemer, hvor/usr/bin
er et symlink til/bin
eller omvendt, hvilket gør begge/usr/bin/env
og/bin/env
anvendelig. Det der betyder noget er, at/usr/bin/env
er til stede, hvilket er tilfældet på alle Linux-distributioner, jeg ' nogensinde har set eller hørt om (og fjernet det ville bryde så mange ting, at ingen ville gøre det).