skalskriptrubrik för bästa kompatibilitet [duplikat]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status" >

Denna fråga har redan svar här :

Kommentarer

  • Det handlar verkligen om hur bärbar du vill vara . Endast Unixes? Alla Linux-kärnbaserade rutor? Alla system även gamla Win 3.0 och VMS (skojar)? /bin/sh är vanligtvis ett bra minimum, var bara medveten om att sh inte är bash .. förväntar sig på de flesta GNU / Linux -system.
  • Även om Android använder linux-kärnan och standardskalet härrör från bash via ash, är användarlandet inte mycket unixliknande och saknar många standardverktyg.

Svar

För portabilitet kan du säkert anta att #!/bin/sh hittar ett mestadels POSIX-kompatibelt skal på alla vanliga Unix- eller Linux-system, men det handlar verkligen om det.

I FreeBSD, OpenBSD och NetBSD ( tillsammans med DragonFly, PC-BSD och några andra derivat) ligger bash på /usr/local/bin/bash (om den är installerad), så /usr/bin/env tillvägagångssätt ger bärbarhet mellan Linux och BSD.

Android är inte ett vanligt Unix- eller Linux-system. På min icke-rotade Android-telefon finns ingen av /usr/bin/env, /bin/bash o r ens /bin/sh finns, och systemskalet är /system/bin/sh.

Ett skalskript som saknar #! (shebang) försöker springa i skalet som kallade det i vissa system, eller kan använda en annan standardtolk (till exempel /bin/bash) , på andra system. Och medan detta kanske fungerar i Android är det inte garanterat att det fungerar i andra operativsystem, där användare kan välja att använda ett interaktivt skal som inte är bash. (Jag använder tcsh i FreeBSD, där det är standardskalet, och shebangfritt skript tolkas av det anropande skalet.)

Så där jag sitter ser det ut som det är inte möjligt att skapa ett skalskript som är bärbart mellan Android- och icke-Android-system (Linux eller Unix), eftersom Android gör saker annorlunda.

Kommentarer

  • Enligt min uppfattning ska /bin/sh peka på något mer som bsh eller dash än bash, som är relativt uppsvälld och därmed föredragen för interaktiv användning.
  • Några misstag här. Det finns fortfarande många (mestadels kommersiella) Enheter här (de flesta av dem Solaris 10 och tidigare) där /bin/sh är Bourne Shel l, inte ett POSIX-skal, POSIX anger inte ' t sökvägen till sh. De flesta skal (och execp / env / find -exec...) kommer att tolka en she-bang- mindre skript med systemet ' s sh, få tolkar det med sig själva och när de gör det gör de det i POSIX-kompatibilitetsläge. Att ' är standard / POSIX-sättet att köra skript, men det förutsätter att den som ringer är i en POSIX-miljö .
  • Angående * BSD bash är valfritt. Det betyder att det finns goda chanser att inte ens /usr/local/bin/bash finns på systemen (för att inte tala om egna system som Solaris, AIX eller HP-Ux).
  • @ StephaneChazelas – re POSIX, jag håller naturligtvis med och att ' därför var orden jag använde var " mest POSIX-kompatibla ". Men den här frågan handlade om bärbarhet, snarare än var man hittar POSIX, och man kan ' inte lita på att ett skal alltid finns på en plats. När det gäller standardtolk tolkas ett shebangfritt skript som körs i tcsh av tcsh på FreeBSD. Uppenbarligen finns ' s inkonsekvens där också, så jag ' har uppdaterat svaret i enlighet därmed.
  • @Ouki – ja förstås, jag trodde bara inte ' att det var relevant för frågan. Men jag ' har lagt till det förtydligandet till svaret för tydlighetens skull.

Svar

Enligt min erfarenhet har #!/bin/sh och #!/bin/bash alltid hamnat i rätt miljö på de få system jag har arbetat med . Jag har ännu inte stött på ett undantag. Jag tycker också att den används rutinmässigt i texter med shell-skript som jag antar är skrivna med tanke på portabilitet i åtanke på grund av olika publik.

Kan inte säga detsamma med #!/usr/bin/env.Vissa system har det installerat som #!/bin/env och har brutit mina python-skript tidigare. Så jag går med den andra punkten.

Här är några stöd för mitt ovanstående uttalande:

På CentOS release 5.7 får jag följande:

$ which env /bin/env 

På Ubuntu 12.04 Precise Pangolin:

$ which env /usr/bin/env 

Dessutom minns jag åtminstone i ett äldre system administratörerna installerat coreutils/opt av någon anledning (kan inte vara en bra metod). Eftersom env är en del av coreutils, det slutade med att användare fick det till /opt/coreutils/bin/env. Visserligen har jag inte använt alla systemen där ute så svaret bygger på min begränsade erfarenhet.

Kommentarer

  • Till exempel är /bin/bash definitivt inte FreeBSD (skulle vara /usr/local/bin/bash eftersom bash inte är en del av standardskal).
  • Det ' är snarare tvärtom: endast några mycket sällsynta system saknar /usr/bin/env (SCO som är barel y existerande, NextStep som är allt annat än utrotad – plus naturligtvis vanligaste icke-unix-system som Android eller Windows). Å andra sidan finns /bin/bash ganska mycket bara på icke-inbäddad Linux. /bin/sh är en säker satsning på alla unix, men några äldre system har ett icke-POSIX Bourne-skal där.
  • @Gilles Tack för informationen. Jag uppdaterade mitt svar med några bevis på vad jag har sett på vissa system jag har stött på.
  • which env isn ' t relevant: det finns en hel del system där /usr/bin är en symlänk till /bin eller vice versa, vilket gör båda /usr/bin/env och /bin/env användbara. Det viktiga är att /usr/bin/env är närvarande, vilket är fallet i alla Linux-distributioner jag ' någonsin har sett eller hört talas om (och ta bort det skulle bryta så många saker att ingen skulle göra det.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *