web-dev-qa-db-fra.com

Quel est le bash shebang préféré?

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 -
  • etc

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.

1007
Kurtosis

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.

1367
l0b0

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

75

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.

19

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 .

15
Keith Thompson

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

3
glenn jackman