Quel est le meilleur Bash shebang?
y a-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 rappelle vaguement avoir entendu il y a longtemps que l'ajout d'un tiret à la fin empêche quelqu'un de passer une commande à votre script, mais je ne trouve aucun détail sur que.
4 réponses
vous devez utiliser #!/usr/bin/env bash
pour portabilité : différents *nixes put bash
en différents endroits, et en utilisant /usr/bin/env
est une solution pour exécuter le premier bash
trouvé sur le PATH
. Et sh
n'est pas bash
.
/bin/sh
est habituellement un lien vers le shell par défaut du système, qui est souvent bash
, mais sur, par exemple, les systèmes Debian est le plus léger dash
. Quoi qu'il en soit , le shell original de Bourne est sh
, donc si votre script utilise quelque bash
(2e génération, "Bourne Again sh") caractéristiques spécifiques ( [[ ]]
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 fonctionne pas. Il y a peut-être une trilogie passionnante de films sur cette évolution...mais ça pourrait être des ouï-dire.
note aussi que lorsqu'on évoque sh
, bash
dans une certaine mesure se comporte comme norme POSIX sh
(voir aussi the GNU docs à ce sujet).
utiliser une ligne shebang pour invoquer L'interprète approprié n'est pas seulement 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 beaucoup d'autres. Par ailleurs, le shebang
#!/bin/sh -
(il peut aussi y avoir deux tirets, i.e. --
) termine Bash options Tout ce qui suit sera traité comme des noms de fichiers et des arguments.
L'utilisation de la commande env
rend votre script portable et vous permet de configurer des environnements personnalisés pour votre script donc les scripts portables devraient 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
Note: sur Debian et les systèmes basés sur Debian, comme Ubuntu, sh
est lié à dash
pas bash
. Comme tous les scripts système utilisent sh
. Cela permet à bash de croître et au système de rester stable, selon Debian.
aussi, pour conserver l'invocation *nix comme je n'utilise jamais d'extensions de fichiers sur les scripts invoqués de shebang, car vous ne pouvez pas omettre l'extension sur l'invocation sur les exécutables comme vous le pouvez sur Windows. La commande file peut l'identifier comme un script.
cela dépend vraiment de la façon dont vous écrivez vos scripts bash. Si votre /bin/sh
est lié de façon symétrique à bash, lorsque bash est invoqué comme sh
, certaines fonctionnalités ne sont pas disponibles .
si vous voulez des fonctionnalités bash-specific, non-POSIX, utilisez #!/bin/bash