que fait `env <commande>`?

37

Que fait la commande env ls -al?

J'avais un test Linux et la question était: "Comment exécuter une commande directement, mais pas son alias?"
Je savais qu'il existe une solution telle que la commande préfixée avec un symbole spécial, mais je l'ai oubliée. Maintenant je sais que c'est \. (lire de ce post ).

Mais je me souviens aussi que quelque part, j’ai lu que pour se débarrasser d’un alias, nous pouvons préfixer une commande avec env. Je l'ai fait et il semble que ça marche, mais ma réponse a été qualifiée de fausse. J'ai lu infoet ainsi de mansuite env, mais je n'ai pas trop compris.

Que envfait-on et env <command>sans aucun argument pour envlui-même?

ALZ
la source
Comme une note, 3 façons de le faire que je peux penser sont env <command>, command <command>et \<command>. À mon avis, si un test dit env <command>est invalide, alors ce test est cassé.
Patrick
@Patrick: Ce n'est pas cassé parce que, comme Chris l'a dit, il pourrait y avoir un alias commandou envqui ferait "\" la seule réponse acceptable.
Pierre Arlaud
1
@ArlaudPierre et `\` ne sont pas définis dans posix (comme un alias d'échappement), ils ne sont donc pas portables. Donc, ce n'est pas plus acceptable que les autres.
Patrick
@ Patrick: vrai, vrai. Maintenant, il faudrait connaître le périmètre exact du test pour le dire. Mais dans tous les cas, trouver que la réponse "env" n'est pas une réponse acceptable n'est pas très honnête, je suis d'accord avec vous à ce sujet.
Pierre Arlaud
Les gars, le test a également été vérifié par un humain (ex-administrateur système certifié LPI, qui enseigne maintenant à d’autres Linux) :) Je me suis plaint au vérificateur, je mann’ai pas compris ce qui se passait envexactement. Après ce post - c'est clair et ma réponse a été examinée (acceptée). Merci à tous!
ALZ

Réponses:

38

Cette commande

env name=value name2=value2 program and args

exécute la commande program and argsavec un environnement formé en étendant l'environnement actuel avec les variables d'environnement et les valeurs désignées par name=valueet name2=value2. Si vous n'incluez pas d'argument tel que name=value, l'environnement actuel est transmis sans modification.

Ce qui est important en ce qui concerne les alias, c’est que env est une commande externe. Par conséquent, il n’a aucune «connaissance» des alias: les alias sont une construction shell qui ne fait pas partie du modèle de processus normal et n’a aucune incidence sur les programmes directement. exécuté par des programmes non-shell (comme env ). env passe simplement le program and argumentsà un appel à exec (comme execvp , qui recherchera dans le PATH program).

En fait, utiliser env comme ceci est un moyen (principalement) indépendant du shell d'éviter les alias, les fonctions de shell, les commandes internes du shell et tout autre élément de la fonctionnalité de shell susceptible de remplacer ou de remplacer les arguments de position de commande (les noms de programmes) - à moins, bien sûr, envest un alias, ou une fonction shell! Si vous craignez d’ envêtre un alias, vous pouvez épeler le chemin complet (par exemple /usr/bin/env, même s’il peut varier).

Chris Johnsen
la source
24

Une autre utilisation importante de env(à part le contournement de la recherche d’alias de commande) est qu’elle recherche PATHla commande. Ceci est important lorsque des chemins absolus sont requis, mais varient d'un système à l'autre.

Par exemple, commencer un script Bash avec #!/bin/bashest bien, alors que ce #!bashn’est pas le cas, bien qu’il /binsoit inclus dans PATHtous les systèmes raisonnables.

Je rencontrais fréquemment ce problème dans les programmes Python, qui commençaient généralement par #!/usr/bin/env pythonéviter de spécifier le chemin d'accès complet, dépendant du système, de l' pythonexécutable (notez toutefois qu'il nécessite toujours de envrésider /usr/bin, ce qui est toutefois beaucoup plus courant que l'emplacement du python. binaire).

trompeur
la source