Utiliser env dans le shebang d’un script
Les scripts Python ne sont pas différents des scripts dans tout autre langage.
L’utilisation de #!/usr/bin/env python
ou #!/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éteur du langage pour exécuter le code à l'intérieur du script, et le shebang est le "guide" pour trouver, dans votre exemple, python
.
Utiliser #!/usr/bin/env python
au lieu de l'absolu (chemin complet) #!/usr/bin/python
s'assure que python (ou tout autre interpréteur de langage) est trouvé, au cas où il ne se trouverait pas exactement au même emplacement que Linux ou unix les distributions, comme expliqué par exemple ici .
Bien que #!/usr/bin/python
fonctionnera sur un système Ubuntu par défaut, il est donc recommandé d’utiliser plutôt #!/usr/bin/env python
.
À propos de env
env
est un exécutable dans /usr/bin
, ou , comme mentionné par @hvd (merci pour le conseil!), disponible en tant que lien symbolique de compatibilité dans /usr/bin
à env
, dans à peu près toutes les distributions Linux.
De Wikipedia :
env est une commande shell pour les systèmes d'exploitation de type Unix et Unix. Il est utilisé pour imprimer une liste de variables d'environnement ou exécuter un autre utilitaire dans un environnement modifié sans avoir à modifier l'environnement 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 en relation avec votre question:
En pratique, env a une autre utilisation courante. Il est souvent utilisé par les scripts shell pour lancer l’interpréteur correct. Dans cette utilisation, l'environnement n'est généralement pas modifié
Vous trouverez plus d'informations sur env
ici et, comme toujours, dans man env
(à partir d'un terminal).
Informations supplémentaires sur le shebang; pourquoi # # python ne fonctionne pas?
Dans un commentaire, on nous demandait pourquoi nous ne pouvions pas simplement utiliser #!python
comme un shebang. Puisque l'interprète est en $PATH
, l'idée est compréhensible.
La raison en est qu'un exécutable est exécuté par execve
, comme nous pouvons le lire ici . Spécifiquement les lignes:
Un script d’interpréteur est un fichier texte avec une autorisation d’exécution activée et dont la première ligne est de la forme:
#! interpreter [optional-arg]
L'interpréteur doit être un chemin d'accès 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é à tout moment pendant le démarrage aussi, peut-être avant que $PATH
soit défini du tout.