Existe-t-il une Bash
Shebang objectivement meilleure que les autres pour la plupart des utilisations?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
Je me souviens vaguement, il ya bien longtemps, d’avoir entendu dire que l’ajout d’un tiret à la fin empêche toute personne de passer une commande à votre script, mais ne trouve aucun détail à ce sujet.
Vous devez utiliser #!/usr/bin/env bash
pour la portabilité : différents * nix placent bash
à différents endroits, et _/usr/bin/env
_ est une solution de contournement pour exécuter le premier bash
trouvé sur le PATH
. Et sh
N'EST PAS bash
.
/bin/sh
est généralement un lien vers le shell par défaut du système, qui est souvent bash
mais, par exemple, les systèmes Debian est le plus léger dash
. Quoi qu’il en soit, le Bourne Shell original est sh
, donc si votre script utilise certaines fonctionnalités spécifiques de bash
(2e génération, "Bourne Again sh") ([[ ]]
tests, des tableaux, diverses suggestions , etc.), vous devriez alors être plus précis et utiliser le dernier. Ainsi, sur les systèmes sur lesquels bash n'est pas installé, votre script ne s'exécutera pas. Je comprends qu’il existe peut-être une trilogie passionnante de films sur cette évolution ... mais c’est peut-être du ouï-dire.
Notez également que, lorsque sh
est évoqué, bash
dans une certaine mesure se comporte comme le standard POSIXsh
(voir aussi le GNU docs à ce sujet).
L'utilisation d'une ligne Shebang pour appeler l'interpréteur approprié ne concerne pas uniquement BASH. Vous pouvez utiliser 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
#!/bin/sh -
(il peut également s'agir de deux tirets, c.-à-d. --
) termine les options bash, tout ce qui suit sera traité comme un nom de fichier et un argument.
L'utilisation de la commande env
rend votre script portable et vous permet de configurer des environnements personnalisés pour votre script. Les scripts portables doivent donc utiliser
#!/usr/bin/env bash
Ou quelle que soit la langue telle que Perl
#!/usr/bin/env Perl
Assurez-vous de regarder les pages man
pour bash
:
man bash
et env
:
man env
Remarque: sur les systèmes Debian et basés sur Debian, comme Ubuntu, sh
est lié à dash
pas bash
. Comme tous les scripts système, utilisez sh
. 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 sur l'invocation sur les exécutables comme vous pouvez le faire sous Windows. La commande de fichier peut l'identifier en tant que script.
Je recommande d'utiliser:
#!/bin/bash
Ce n'est pas 100% portable (certains systèmes placent bash
dans un emplacement autre que /bin
), mais le fait qu'un grand nombre de scripts existants utilisent #!/bin/bash
oblige divers systèmes d'exploitation à créer /bin/bash
au moins un lien symbolique vers l’emplacement principal.
L'alternative de:
#!/usr/bin/env bash
a été suggéré - mais rien ne garantit que la commande env
est dans /usr/bin
(et j'ai utilisé des systèmes là où ce n'est pas le cas). De plus, ce formulaire utilisera la première instance de bash
dans les utilisateurs actuels $PATH
, qui pourrait ne pas être une version appropriée du shell bash.
Si vous avez besoin d'un script pour s'exécuter sur un système qui n'a pas /bin/bash
, vous pouvez le modifier pour qu'il pointe vers le bon emplacement (il est vrai que cela n'est pas pratique).
J'ai discuté des compromis plus en profondeur dans ma réponse à cette question .
Cela dépend vraiment de la façon dont vous écrivez vos scripts bash. Si votre /bin/sh
est lié de façon symbolique à bash, lorsque bash est appelé en tant que sh
, certaines fonctionnalités ne sont pas disponibles .
Si vous voulez des fonctionnalités non POSIX spécifiques à BASH, utilisez #!/bin/bash