web-dev-qa-db-fra.com

Comment fonctionne / usr / bin / env dans une ligne Linux Shebang?

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?

10
user1187968

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.

5
user513951

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.

1
Marcel Nolte

Comme essentiellement

tail -n +1 yourfile | /usr/bin/env python
0
#!/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.

0
Bharathi