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: « Utilisezenvpour localiser l'interpréteurbashet 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 :
- L'utilisateur lance un script exécutable :
chmod +x script.sh
./script.sh
- Le noyau lit le fichier
script.sh. - Il vérifie que les deux premiers caractères sont
#!. - 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/bashpour 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/bashest 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.
envest un utilitaire qui définit/affiche les variables d'environnement et cherche un programme dans lePATH.- Le noyau exécute en réalité :
bash /usr/bin/env bash script.sh envparcourt lePATHdu système pour trouver l'exécutablebash.
Avantages
- Portabilité : que Bash se trouve à
/bin/bash,/usr/bin/bashou ailleurs,envle trouvera tant qu'il est dans lePATH. - Respect de l'environnement utilisateur : si l'utilisateur a configuré son
PATHpour privilégier une version particulière de Bash, celle‑ci sera utilisée. - Le même schéma fonctionne pour d'autres langages :
python #!/usr/bin/env python3
Inconvénients
- Supposition que
/usr/bin/envexiste : sur la plupart des systèmes modernes, c'est le cas, mais pas dans des environnements très spécialisés. - Dépendance au
PATH: si lePATHest mal configuré, une version inattendue de Bash peut être utilisée. - 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
PATHoffre plus de flexibilité.
2) Scripts d'exploitation destinés à un serveur spécifique
- Si tous vos serveurs utilisent
/bin/bashde 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/shfonctionne 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/envest le standard le plus répandu. - En l'absence de raison particulière, utilisez toujours
#!/usr/bin/env ….
9. Résumé
#!/usr/bin/env bashet#!/bin/bashne 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 lePATH→ plus flexible mais dépend duPATH.- Dans la plupart des environnements de développement et de déploiement modernes, il est recommandé d'utiliser
#!/usr/bin/env bash.

Aucun commentaire.