Je connais la ligne Shebang comme ceci:
#!/bin/sh
mais j'ai découvert que je peux aussi utiliser la ligne Shebang comme ceci:
#!/usr/bin/env python3
Cela m'embrouille, quelqu'un peut-il m'expliquer comment Linux va traiter celui-ci?
env
est le nom d'un programme Unix. Si vous lisez le manuel (man env
) vous pouvez voir qu'une façon de l'utiliser est env COMMAND
, où dans votre cas, COMMAND
est python3
.
Selon le manuel, cela
Définissez chaque NOM sur VALUE dans l'environnement et exécutez COMMAND.
L'exécution de env
seule vous montrera quels NOM et VALEURS sont définis:
$ env
TERM=xterm-256color
Shell=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
…
Donc, /usr/bin/env python3
est une instruction pour définir le PATH
(ainsi que toutes les autres paires NAME + VALUE), puis exécuter python3
, en utilisant le premier répertoire du PATH
qui contient le python3
exécutable.
Les versions plus récentes * nix résoudront ce problème de la même manière que la commande which
fonctionne.
Il regarde dans tous les répertoires définis dans la variable d'environnement $ PATH, où qu'il soit défini (global, dans votre .bashrc ou un autre script de connexion ou à la main), un par un et renvoie la première correspondance.
Il est important que certaines versions de Linux créent des fichiers d'alias (aka symlinks), par ex. debian.
Autre remarque: l'alias de commande bash remplace ce comportement car il est exécuté en premier.
Comme essentiellement
tail -n +1 yourfile | /usr/bin/env python
#!/bin/sh
n'est que le chemin de l'interpréteur binaire, alors que
#!/usr/bin/env python3
a le chemin de l'interpréteur passant python3
comme argument facultatif à #!/usr/bin/env
interprète
Veuillez consulter wiki pour plus d'informations.