J'ai remarqué que certains scripts python commencent par
#!/usr/bin/env python
au lieu de
#!/usr/bin/python
Les scripts python sont-ils les seuls à utiliser #!/usr/bin/env
? Existe-t-il des scripts qui commencent par exemple avec #!/usr/bin/env bash
ou #!/usr/bin/env Perl
? Sinon, pourquoi les scripts python sont-ils différents?
Les scripts Python ne sont pas différents des scripts de tout autre langage.
L'utilisation de #!/usr/bin/env python
ou de #!/usr/bin/python
joue un rôle si le script est exécutable et appelé sans la langue précédente. Le script appelle ensuite l'interprète de la langue pour exécuter le code à l'intérieur du script. Shebang est le "guide" permettant de rechercher, dans votre exemple, python
name__.
Utiliser #!/usr/bin/env python
au lieu de l'absolu (chemin complet) #!/usr/bin/python
permet de s'assurer que python (ou l'interpréteur de toute autre langue) est trouvé, au cas où il ne se trouverait peut-être pas exactement au même endroit et à différentes distributions de type Linux ou Unix , comme expliqué par exemple ici .
Bien que #!/usr/bin/python
fonctionne sur un système Ubuntu par défaut, il est donc recommandé d’utiliser plutôt #!/usr/bin/env python
.
env
est un exécutable dans /usr/bin
, ou , comme indiqué par @hvd (merci pour l'indice!), disponible sous forme de lien symbolique de compatibilité dans /usr/bin
vers env
name__, dans pratiquement toutes les distributions Linux. .
De Wikipedia :
env est une commande Shell pour les systèmes d'exploitation Unix et de type 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, les 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. Les scripts Shell l'utilisent souvent pour lancer le bon interpréteur. Dans cette utilisation, l'environnement n'est généralement pas modifié
Vous trouverez plus d'informations sur env
here et, comme toujours, dans man env
(depuis un terminal).
Dans un commentaire, il a été demandé pourquoi nous ne pouvons pas simplement utiliser #!python
en tant que Shebang. Puisque l'interprète est dans $PATH
, l'idée est compréhensible.
La raison en est qu'un exécutable est exécuté par execve
name__, comme on peut le lire ici . Plus précisément les lignes:
Un script interpréteur est un fichier texte pour lequel l'autorisation d'exécution est activée et dont la première ligne est de la forme:
#! interpreter [optional-arg]
L'interpréteur doit être a chemin d'accès valide pour un exécutable ....
expliquez que execve
exige un chemin complet (valide) vers l'interpréteur. Cela a du sens, car les scripts (dans n’importe quel langage) peuvent, par exemple, être exécuté à tout moment du démarrage également, éventuellement avant que $PATH
ne soit défini.
La réponse de Jacob l'explique bien. Cependant, il y a un autre point que je voudrais mentionner.
Utiliser /usr/bin/env/
dans python sert encore un objectif. Comme python prend en charge environnements virtuelsEn utilisant /usr/bin/env python
, vous vous assurerez que vos scripts s’exécutent dans l’environnement virtuel, le cas échéant. Alors que /usr/bin/python
sera exécuté en dehors de l’environnement virtuel.
En plus des réponses données ci-dessus, l'utilisation de /usr/bin/env
permet à votre Python d'être installé à des emplacements non standard, et tant que votre PATH
est configuré correctement, le script s'exécutera sans modification sous un système UNIX. système de style qui a /usr/bin/env
. Cela inclut toutes les versions modernes de Linux et OS/X.