Le secret de la première ligne d'un script Linux : que signifient réellement #!/usr/bin/env bash et #!/bin/bash ?

Lorsque vous écrivez un script sous Linux, vous avez l'habitude d'inscrire en haut de votre fichier :

#!/usr/bin/env bash

ou bien

#!/bin/bash

À première vue, cela ressemble simplement à un commentaire… Mais qu'est‑ce que cette ligne ? Et quelles sont les différences entre les deux ? Dans cet article, nous allons comprendre en détail cette ligne, et vous indiquer quand choisir l'une ou l'autre.


1. Ce n'est pas un commentaire : qu'est‑ce qu'un shebang ?



La ligne qui commence par #! est appelée shebang.

#!/bin/bash

Du point de vue du shell, le # indique un commentaire. Mais du point de vue du noyau du système d'exploitation, ce n'est pas un commentaire :

« Cette ligne indique au noyau quel interpréteur doit être utilisé pour exécuter le script. »

En d'autres termes :

  • #!/bin/bash : « Exécutez ce fichier avec /bin/bash. »
  • #!/usr/bin/env bash : « Utilisez env pour localiser l'interpréteur bash et exécutez le script avec celui‑ci. »

2. Comment le noyau exécute-t-il un script ?

Le processus d'exécution peut être simplifié ainsi :

  1. L'utilisateur lance un script exécutable :
chmod +x script.sh
./script.sh
  1. Le noyau lit le fichier script.sh.
  2. Il vérifie que les deux premiers caractères sont #!.
  3. Si c'est le cas, il interprète le reste de la ligne comme * le chemin de l'interpréteur + éventuels arguments. * Il lance alors ce programme en lui passant le chemin du script comme argument.

Par exemple, si la première ligne est :

#!/bin/bash

Le noyau exécute essentiellement :

/bin/bash script.sh

C'est équivalent à ce que vous feriez en tapant bash script.sh vous-même.

Remarque : il ne doit pas y avoir d'espace après #!. Le premier caractère doit être # et le second !.


3. Signification et caractéristiques de #!/bin/bash



C'est la forme la plus courante que vous voyez.

#!/bin/bash

Signification

  • Le script est un script Bash et l'interpréteur se trouve à /bin/bash.
  • Le noyau utilisera toujours /bin/bash pour l'exécuter.

Avantages

  • Clarté : vous savez exactement quel interpréteur sera utilisé.
  • Performance / simplicité : pas de recherche de chemin supplémentaire.
  • Sur la plupart des distributions Linux, /bin/bash est considéré comme l'emplacement « standard ».

Inconvénients

  • Moins portable : sur certains systèmes, Bash peut se trouver à /usr/bin/bash, /usr/local/bin/bash, ou même être absent.
  • Sur macOS, BSD, NixOS ou certains conteneurs, le chemin peut différer.

4. Signification et caractéristiques de #!/usr/bin/env bash

Cette forme est de plus en plus courante dans les scripts modernes.

#!/usr/bin/env bash

Le point clé est /usr/bin/env.

  • env est un utilitaire qui définit/affiche les variables d'environnement et cherche un programme dans le PATH.
  • Le noyau exécute en réalité : bash /usr/bin/env bash script.sh
  • env parcourt le PATH du système pour trouver l'exécutable bash.

Avantages

  1. Portabilité : que Bash se trouve à /bin/bash, /usr/bin/bash ou ailleurs, env le trouvera tant qu'il est dans le PATH.
  2. Respect de l'environnement utilisateur : si l'utilisateur a configuré son PATH pour privilégier une version particulière de Bash, celle‑ci sera utilisée.
  3. Le même schéma fonctionne pour d'autres langages : python #!/usr/bin/env python3

Inconvénients

  1. Supposition que /usr/bin/env existe : sur la plupart des systèmes modernes, c'est le cas, mais pas dans des environnements très spécialisés.
  2. Dépendance au PATH : si le PATH est mal configuré, une version inattendue de Bash peut être utilisée.
  3. Sécurité : dans des environnements très sensibles, on préfère parfois un chemin absolu pour éviter toute ambiguïté.

5. Comparaison synthétique

Critère #!/bin/bash #!/usr/bin/env bash
Méthode de localisation de l'interpréteur Chemin absolu fixe Recherche dans le PATH
Portabilité Faible (si le chemin diffère) Élevée (si Bash est dans le PATH)
Bash utilisé Toujours /bin/bash Le premier bash trouvé dans le PATH
Garantie de version Relativement fiable Dépend du PATH
Contrôle de sécurité Plus strict (chemin fixe) Plus souple (dépend du PATH)
Tendance actuelle Style plus ancien Recommandé dans la plupart des cas

6. Quand utiliser quoi ?

1) Scripts personnels ou d'équipe (environnements de développement)

  • Recommandation : #!/usr/bin/env bash.
  • Raison : les serveurs, les environnements locaux ou CI peuvent avoir Bash à différents emplacements, et le PATH offre plus de flexibilité.

2) Scripts d'exploitation destinés à un serveur spécifique

  • Si tous vos serveurs utilisent /bin/bash de façon cohérente : #!/bin/bash.
  • Raison : garantit l'utilisation du même interpréteur et évite les surprises liées au PATH.

3) Si vous voulez la plus grande portabilité possible

  • Réfléchissez à l'utilisation de sh : #!/bin/sh fonctionne sur pratiquement tout système.
  • Attention : vous ne pourrez pas utiliser les extensions Bash ([[ ]], tableaux, etc.).

7. Conseils pratiques pour #!/usr/bin/env bash

1) Exécution correcte

Ne vous contentez pas de faire :

bash script.sh   # le shebang est ignoré

Préférez :

chmod +x script.sh   # rendre exécutable
./script.sh          # exécuter directement

Le noyau lira alors le shebang et utilisera l'interpréteur indiqué.

2) Vérification de la transmission d'arguments

#!/usr/bin/env bash

echo "Interpréteur : $0"
echo "Arguments : $@"

Exécution :

chmod +x test.sh
./test.sh hello world

Sortie :

Interpréteur : ./test.sh
Arguments : hello world

$0 correspond au chemin du script, et le noyau a réellement exécuté env bash test.sh hello world.


8. Mythes courants

« La première ligne est juste un commentaire, on peut l'omettre »

  • Vrai : ce n'est pas obligatoire.
  • Si vous lancez le script explicitement avec l'interpréteur (bash myscript.sh), le shebang est ignoré.
  • Mais si vous voulez exécuter le script directement (./myscript.sh), le shebang est indispensable.

« #!/bin/env fonctionne aussi »

  • Certains systèmes ont /bin/env, mais /usr/bin/env est le standard le plus répandu.
  • En l'absence de raison particulière, utilisez toujours #!/usr/bin/env ….

9. Résumé

  • #!/usr/bin/env bash et #!/bin/bash ne sont pas des commentaires ; ils indiquent au noyau quel interpréteur utiliser.
  • #!/bin/bash : toujours /bin/bash → prévisible mais moins portable.
  • #!/usr/bin/env bash : recherche dans le PATH → plus flexible mais dépend du PATH.
  • Dans la plupart des environnements de développement et de déploiement modernes, il est recommandé d'utiliser #!/usr/bin/env bash.

image of shebang in linux script