Utilisation de env dans le shebang d'un script.
Les scripts de Python ne sont pas différents des scripts de tout autre langage sur ce point.
Soit l'utilisation de #!/usr/bin/env python
o #!/usr/bin/python
joue un rôle si le script est exécutable et appelé sans la langue précédente. Le script appelle alors l'interprète du langage pour exécuter le code à l'intérieur du script, et le shebang est le "guide" à trouver, dans votre exemple, python
.
Utilisation de #!/usr/bin/env python
au lieu de l'absolu (chemin complet) #!/usr/bin/python
s'assure que Python (ou l'interpréteur de tout autre langage) est trouvé, au cas où il ne serait pas exactement au même endroit dans différentes distributions Linux ou Unix, comme expliqué par exemple. ici .
Bien que #!/usr/bin/python
fonctionnera sur un système Ubuntu par défaut, c'est donc une bonne pratique d'utiliser #!/usr/bin/env python
à la place.
À propos d'env
env
est un exécutable dans /usr/bin
, o comme mentionné par @hvd (merci pour l'astuce !), disponible comme lien symbolique de compatibilité dans /usr/bin
a env
dans presque toutes les distributions Linux.
En Wikipedia :
env est une commande Shell pour les systèmes d'exploitation Unix et de type Unix. Elle est utilisée soit pour imprimer une liste de variables d'environnement, soit pour exécuter un autre utilitaire dans un environnement altéré sans avoir à modifier l'environnement actuellement existant. En utilisant env, des variables peuvent être ajoutées ou supprimées, et les variables existantes peuvent être modifiées en leur attribuant de nouvelles valeurs.
et par rapport à votre question :
En pratique, env a une autre utilisation courante. Il est souvent utilisé par Shell Shell pour lancer le bon interprète. Dans cet usage, l'environnement n'est typiquement pas modifié
En savoir plus env
se trouve ici et, comme toujours, en man env
(depuis un terminal).
Informations supplémentaires sur le shebang ; pourquoi #!Python ne fonctionne pas ?
Dans un commentaire, il a été demandé pourquoi nous ne pouvons pas simplement utiliser #!python
comme un shebang. Puisque l'interpréteur est dans $PATH
L'idée est compréhensible.
La raison en est qu'un exécutable est exécuté par execve
comme on peut le lire ici . Plus précisément les lignes :
Un interprète script est un fichier texte dont la permission d'exécution est activée et dont la première ligne est de la forme :
#! interpreter [optional-arg]
L'interprète doit être un nom de chemin valide pour un exécutable....
expliquer que execve
exige un chemin complet (valide) vers l'interpréteur. Cela a du sens, puisque les scripts (dans n'importe quelle langue) peuvent par exemple être exécutés à n'importe quel moment pendant le démarrage aussi, éventuellement avant que $PATH
n'est pas défini du tout.