Quel est le Bash Shebang préféré?

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 souviens vaguement il y a longtemps d’entendre 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.

Vous devez utiliser #!/usr/bin/env bash pour la portabilité : différents * nix mettent bash à des endroits différents et l’utilisation de /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, que beaucoup ou la plupart des endroits seront /usr/bin/bash . Cependant, le shell Bourne original est sh , donc si votre script utilise un bash (2e génération, “Bourne Again sh”), 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 s’exécutera pas.

Je comprends qu’il peut y avoir une sortinglogie passionnante de films sur cette évolution… mais cela pourrait être du ouï-dire.

Utiliser une ligne shebang pour appeler l’interpréteur approprié ne concerne pas que 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 y avoir deux tirets, c.-à -- d. -- ) met fin aux options de bash tout ce qui sera traité après comme noms de fichiers et arguments.

L’utilisation de la commande env rend votre script portable et vous permet de configurer des environnements personnalisés pour votre script. Par conséquent, les scripts portables doivent utiliser

 #!/usr/bin/env bash 

Ou pour n’importe quelle langue comme pour Perl

 #!/usr/bin/env perl 

Veillez à consulter les pages de man relatives à bash :

 man bash 

et env :

 man env 

Note: Sur les systèmes Debian et Debian, comme Ubuntu, sh est lié à dash not bash . Comme tous les scripts système utilisent sh . Cela permet à bash de croître et au système de restr stable, selon Debian.

De même, pour continuer à invoquer * nix comme je n’utilise jamais d’extensions de fichiers sur des scripts invoqués shebang, car vous ne pouvez pas omettre l’extension lors de l’appel sur des exécutables comme vous le pouvez sous Windows. La commande de fichier 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é par un lien symbolique à bash, lorsque bash est appelé en sh , certaines fonctionnalités ne sont pas disponibles .

Si vous voulez des fonctionnalités non-POSIX spécifiques à bash, utilisez #!/bin/bash