Existe-t-il un Bash
shebang objectivement meilleur que les autres pour la plupart des utilisations?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- etc
Je me souviens vaguement d'entendre il y a longtemps que l'ajout d'un tiret à la fin empêche quelqu'un de passer une commande à votre script, mais ne trouve aucun détail à ce sujet.
/usr/local/bin/bash
sur OpenBSD.Réponses:
Vous devez utiliser
#!/usr/bin/env bash
pour la portabilité : différents * nixes placésbash
à différents endroits, et l'utilisation/usr/bin/env
est une solution de contournement pour exécuter le premierbash
trouvé sur lePATH
. Et cesh
n'est pas le casbash
.la source
/bin/sh
, etc.).bash
ne vit pas/bin
sur tous les systèmes.alias shebang='echo "#!/usr/bin/env bash"'
maintenant je dois juste ouvrir le terminal et taper shebang au lieu d'aller ici.env
c'est à/usr/bin/env
. Cela pourrait être à/bin/env
ou n'importe où en fait, tant qu'il est sur le chemin. Cela pourrait être à/dummy/env
si/dummy
est dedansPATH
. Shebang lui-même n'est pas défini sous POSIX, donc je pourrais faire#!stop toaster
démarrer la machine à café USB et être compatible POSIX. Ce#!/usr/bin/env bash
n'est donc pas mieux que#!/bin/bash
ça, ça pourrait être moins portable selon./usr/bin/env
existe sur plus de machines que sur/bin/bash
xor/usr/bin/bash
, donc un script qui commence par cette ligne fera la chose attendue sur autant de machines que possible./bin/sh
est généralement un lien vers le shell par défaut du système, ce qui est souventbash
le cas, par exemple, les systèmes Debian sont plus légersdash
. Quoi qu'il en soit, le shell Bourne d'origine estsh
, donc si votre script utilisebash
des fonctionnalités spécifiques (2e génération, "Bourne Again sh") ([[ ]]
tests, tableaux, diverses choses sucrées, etc.), alors vous devriez être plus spécifique et utiliser la dernière . De cette façon, sur les systèmes où bash n'est pas installé, votre script ne s'exécutera pas. Je comprends qu'il peut y avoir une trilogie passionnante de films sur cette évolution ... mais cela pourrait être du ouï-dire.Notez également que lorsqu'il est évoqué comme
sh
,bash
il se comporte dans une certaine mesure comme la norme POSIXsh
(voir également les documents GNU à ce sujet).la source
/bin/sh
à aucun endroit/usr
car cela rendrait plutôt difficile l'exécution des scripts d'initialisation avant le/usr
montage./bin
et/sbin
pendant des années viennent d'être des liens symboliques par défaut, vers/usr/bin
et/usr/sbin
, donc dans ce contexte/bin/sh
est un lien versbash
et le réel répertoire est/usr/bin
. Mais je vais corriger ce qui précède.Je recommande d'utiliser:
Ce n'est pas 100% portable (certains systèmes placent
bash
dans un endroit autre que/bin
), mais le fait que beaucoup de scripts existants utilisent des#!/bin/bash
pressions différents systèmes d'exploitation pour faire/bin/bash
au moins un lien symbolique vers l'emplacement principal.L'alternative de:
a été suggéré - mais il n'y a aucune garantie que la
env
commande se trouve/usr/bin
(et j'ai utilisé des systèmes là où elle ne l'est pas). De plus, ce formulaire utilisera la première instance debash
dans les utilisateurs actuels$PATH
, ce qui pourrait ne pas être une version appropriée du shell bash.(Mais
/usr/bin/env
devrait fonctionner sur n'importe quel système raisonnablement moderne, soit parce qu'ilenv
est installé, soit parce/usr/bin
que le système fait quelque chose pour le faire fonctionner. Le système auquel j'ai fait référence ci-dessus était SunOS 4, que je n'ai probablement pas utilisé depuis environ 25 ans.)Si vous avez besoin d'un script pour s'exécuter sur un système qui n'en a pas
/bin/bash
, vous pouvez modifier le script pour pointer vers l'emplacement correct (ce qui est certes gênant).J'ai discuté des compromis plus en profondeur dans ma réponse à cette question .
Une mise à jour quelque peu obscure: un système que j'utilise, Termux , une couche de type Linux de bureau qui fonctionne sous Android, n'a pas
/bin/bash
(bash
est/data/data/com.termux/files/usr/bin/bash
) - mais il a une gestion spéciale à prendre en charge#!/bin/bash
.la source
L'utilisation d'une ligne shebang pour appeler l'interpréteur approprié n'est pas uniquement pour BASH. Vous pouvez utiliser le shebang pour n'importe quel langage interprété sur votre système tel que Perl, Python, PHP (CLI) et bien d'autres. Au fait, le shebang
(il peut également y avoir deux tirets, c'est-à-dire
--
).L'utilisation de la
env
commande rend votre script portable et vous permet de configurer des environnements personnalisés pour votre script, donc les scripts portables doivent utiliserOu pour quelque langue que ce soit comme Perl
N'oubliez pas de consulter les
man
pages pourbash
:et
env
:Remarque: Sur Debian et les systèmes basés sur Debian, comme Ubuntu,
sh
est lié àdash
pasbash
. Comme tous les scripts système l'utilisentsh
. Cela permet à bash de croître et au système de rester stable, selon Debian.En outre, pour conserver l'invocation * nix comme je n'utilise jamais d'extensions de fichier sur les scripts invoqués par shebang, car vous ne pouvez pas omettre l'extension lors de l'invocation sur les exécutables comme vous pouvez le faire sous Windows. La commande file peut l'identifier comme un script.
la source
Cela dépend vraiment de la façon dont vous écrivez vos scripts bash. Si votre
/bin/sh
est lié à bash, lorsque bash est appelé assh
, certaines fonctionnalités ne sont pas disponibles .Si vous voulez des fonctionnalités spécifiques à bash, non POSIX, utilisez
#!/bin/bash
la source
pkg_add
, il est situé dans/usr/local/bin
, qui peut ne pas être sur le chemin.POSIX
fonctionnalité?