shell script header for bedst kompatibilitet [duplikat]

Dette spørgsmål har allerede svar her :

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å, at sh ikke er bash .. 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 som bsh eller dash end bash, 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 til sh. De fleste skaller (og execp / env / find -exec...) fortolker et she-bang- mindre script med systemet ' s sh, 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/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.

Kommentarer

  • For eksempel er /bin/bash bestemt ikke FreeBSD (ville være /usr/local/bin/bash da bash ikke er en del af standardskaller).
  • Det ' er snarere det modsatte: kun nogle meget sjældne systemer mangler /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.
  • @Gilles Tak for informationen. Jeg opdaterede mit svar med nogle bevis for, hvad jeg har set på nogle systemer, jeg er stødt på.
  • 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).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *