Question Quel est le shebang Bash préféré?


Y a-t-il Bash Shebang objectivement mieux que les autres pour la plupart des utilisations?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • etc

Je me rappelle vaguement depuis 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.


732
2018-04-29 21:37


origine


Réponses:


Tu devrais utiliser #!/usr/bin/env bash pour portabilité: différent * nixes mis bash dans des endroits différents, et en utilisant /usr/bin/env est une solution de contournement pour exécuter le premier bash trouvé sur le PATH. Et sh n'est pas bash.


996
2018-04-30 12:14



/bin/sh est généralement un lien vers le shell par défaut du système, que beaucoup ou la plupart des endroits seront/usr/bin/bash. Cependant, le shell Bourne original est sh, donc si votre script utilise un peu bash (2ème génération, "Bourne Again sh"), alors vous devriez être plus précis et utiliser le plus tard. De cette façon, sur les systèmes où bash n'est pas installé, votre script ne sera pas exécuté.

Je comprends qu'il existe peut-être une trilogie passionnante de films sur cette évolution ... mais cela pourrait être du ouï-dire.


60
2018-04-29 21:39



Utiliser une ligne shebang pour appeler l'interpréteur approprié n'est pas seulement pour BASH. Vous pouvez utiliser le shebang pour tout 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'est-à-dire --) termine les options bash tout après sera traité comme des noms de fichiers et des arguments.

En utilisant le env commande 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 pour n'importe quelle langue comme pour Perl

#!/usr/bin/env perl

Assurez-vous de regarder le man pages pour bash:

man bash

et env:

man env

Note: Sur les systèmes Debian et Debian, comme Ubuntu, sh est lié à dash ne pas bash. Comme tous les scripts système utilisent sh. Cela permet à bash de se développer et le système de rester stable, selon Debian.

Aussi, pour garder l'invocation * nix comme je n'utilise jamais les extensions de fichiers sur les scripts invoqués par shebang, comme vous ne pouvez pas omettre l'extension sur l'invocation sur les exécutables comme vous pouvez le faire sur Windows. La commande de fichier peut l'identifier comme un script.


14
2017-10-26 19:55



Cela dépend vraiment de la façon dont vous écrivez vos scripts bash. Si ton /bin/sh est symlinked à bash, quand bash est invoqué comme sh, certaines fonctionnalités sont indisponibles.

Si vous souhaitez utiliser des fonctionnalités non-POSIX propres à bash, utilisez #!/bin/bash


1
2018-04-29 22:36