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 attsh
inte ärbash
.. 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 sombsh
ellerdash
änbash
, 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 tillsh
. De flesta skal (ochexecp
/env
/find -exec...
) kommer att tolka en she-bang- mindre skript med systemet ' ssh
, 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
på /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.
/bin/bash
definitivt inte FreeBSD (skulle vara/usr/local/bin/bash
eftersom bash inte är en del av standardskal)./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.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.