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.

785
demandé sur nbro 2012-04-30 01:37:00

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 .

1066
répondu l0b0 2018-08-25 09:24:37

/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).

62
répondu delicateLatticeworkFever 2018-09-20 11:15:10

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.

15
répondu Jamie R Robillard Sr. 2017-04-14 11:00:12

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

3
répondu glenn jackman 2017-09-27 02:23:22