web-dev-qa-db-fra.com

que fait «env <commande>»?

Quelle est la commande env ls -al Faire?

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

Mais je me souviens aussi que quelque part j'ai lu que pour se débarrasser de l'alias, nous pouvons préfixer une commande avec env. Je l'ai fait et cela semble fonctionner, mais ma réponse a été qualifiée de fausse. J'ai lu info et man sur env, mais je ne comprenais pas trop.

Que fait env et exactement dans env <command> sans argument pour env lui-même?

39
ALZ

Cette commande

env name=value name2=value2 program and args

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

La chose clé qui se produit en ce qui concerne les alias est que env est une commande externe, donc elle n'a aucune "connaissance" des alias: les alias sont une construction Shell qui ne font pas partie du modèle de processus normal et ont aucun impact sur les programmes qui sont directement exécutés par des programmes non Shell (comme env). env passe simplement le program and arguments à un appel exec (comme execvp, qui recherchera program) dans le CHEMIN.

Fondamentalement, l'utilisation de env comme ceci est un moyen (principalement) indépendant de Shell d'éviter les alias, les fonctions Shell, les commandes intégrées de Shell et tout autre élément de fonctionnalité Shell qui pourrait remplacer ou remplacer les arguments de position de commande ( c'est-à-dire les noms de programme) - sauf, bien sûr, env est un alias ou une fonction Shell! Si vous craignez que env soit un alias, vous pouvez indiquer le chemin complet (par exemple /usr/bin/env, bien que cela puisse varier).

40
Chris Johnsen

Une autre utilisation importante de env (en plus de contourner la recherche d'alias de commande) est qu'il recherche dans la PATH la 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/bash va bien, tandis que #!bash ne l'est pas, malgré /bin étant inclus dans le PATH sur tous les systèmes raisonnables.

Je l'ai fréquemment rencontré dans les programmes Python, qui commencent généralement par #!/usr/bin/env python pour éviter de spécifier le chemin complet, dépendant du système, de l'exécutable python (notez cependant qu'il requiert toujours que env réside dans /usr/bin, c'est cependant beaucoup plus courant que l'emplacement du binaire python binaire).

26
misberner