skallskriptoverskrift for best kompatibilitet [duplikat]

Dette spørsmålet har allerede svar her :

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å at sh ikke er bash .. 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 som bsh eller dash enn bash, 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 til sh. De fleste skjell (og execp / env / find -exec...) vil tolke en she-bang- mindre skript med systemet ' s sh, 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/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.

Kommentarer

  • For eksempel er /bin/bash definitivt ikke FreeBSD (ville vær /usr/local/bin/bash da bash ikke er en del av standardskjellene.
  • Det ' er snarere det motsatte: bare noen svært sjeldne systemer mangler /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.
  • @Gilles Takk for informasjonen. Jeg oppdaterte svaret mitt og ga bevis på hva jeg har sett på noen systemer jeg har kommet over.
  • 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).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *