Per la portabilità, puoi tranquillamente presumere che #!/bin/sh
troverà una shell per lo più conforme a POSIX su qualsiasi sistema Unix o Linux standard, ma questo è tutto.
In FreeBSD, OpenBSD e NetBSD ( insieme a DragonFly, PC-BSD e alcuni altri derivati), bash si trova in /usr/local/bin/bash
(se è installato), quindi /usr/bin/env
fornisce la portabilità tra Linux e BSD.
Android non è un sistema Unix o Linux standard. Sul mio telefono Android non rootato, nessuno di /usr/bin/env
, /bin/bash
o r anche /bin/sh
esiste e la shell di sistema è /system/bin/sh
.
Uno script di shell a cui manca il #!
(shebang) tenterà di essere eseguito nella shell che lo ha chiamato su alcuni sistemi, oppure potrebbe utilizzare un interprete predefinito diverso (/bin/bash
ad esempio) , su altri sistemi. E sebbene questo possa funzionare su Android, non è garantito che funzioni in altri sistemi operativi, dove gli utenti possono scegliere di utilizzare una shell interattiva diversa da bash
. (Uso tcsh in FreeBSD, dove è la shell predefinita, e gli script senza shebang sono interpretati dalla shell chiamante.)
Quindi da dove mi siedo, sembra che sia non è possibile creare uno script di shell che sia portabile tra sistemi Android e non Android (Linux o Unix), perché Android fa le cose in modo diverso.
Commenti
Nella mia esperienza, #!/bin/sh
e #!/bin/bash
hanno sempre trovato lambiente giusto sui pochi sistemi su cui ho lavorato . Devo ancora incontrare uneccezione. Trovo anche che venga utilizzato regolarmente nei testi relativi allo scripting della shell che suppongo siano scritti tenendo presente la portabilità a causa del pubblico diversificato.
Non posso “dire lo stesso con #!/usr/bin/env
.Alcuni sistemi lo hanno installato come #!/bin/env
e in passato hanno danneggiato i miei script Python. Quindi, vado con il secondo punto.
Ecco un po di supporto per la mia dichiarazione di cui sopra:
Sulla versione 5.7 di CentOS ottengo quanto segue:
$ which env /bin/env
Su Ubuntu 12.04 Precise Pangolin:
$ which env /usr/bin/env
Inoltre, almeno in un vecchio sistema, ricordo gli amministratori installato coreutils
su /opt
per qualche motivo (potrebbe non essere una best practice). Poiché env
fa parte di coreutils
, gli utenti hanno finito per ottenerlo a /opt/coreutils/bin/env
. Devo ammettere che non ho utilizzato tutti i sistemi disponibili, quindi la risposta si basa sulla mia esperienza limitata.
Commenti
/bin/bash
non è sicuramente FreeBSD (sarebbe essere/usr/local/bin/bash
poiché bash non fa parte delle shell predefinite)./usr/bin/env
(SCO che è barel y esistente, NextStep che è quasi estinto, oltre ovviamente ai più comuni sistemi non unix come Android o Windows). Daltra parte,/bin/bash
esiste praticamente solo su Linux non incorporato./bin/sh
è una scommessa sicura su qualsiasi Unix, ma alcuni sistemi meno recenti hanno una shell Bourne non POSIX.which env
non è ' t rilevante: ci sono diversi sistemi in cui/usr/bin
è un collegamento simbolico a/bin
o viceversa, il che rende entrambi/usr/bin/env
e/bin/env
utilizzabile. Ciò che conta è che/usr/bin/env
sia presente, come nel caso di tutte le distribuzioni Linux di cui ' ho mai visto o sentito parlare (e rimuovendolo romperebbe così tante cose che nessuno lo farebbe).