qu'est-ce que `env <command>` fait?

Quelle est la command env ls -al ?

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

Mais je me souviens aussi que quelque part j'ai lu que pour se débarrasser d'alias nous pouvons préfixer une command avec env . Je l'ai fait et il semble fonctionne, mais ma réponse a été qualifiée de mauvaise. J'ai lu info et man sur env , mais je n'ai pas trop compris.

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

Cette command

 env name=value name2=value2 program and args 

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

La principale chose qui se produit en ce qui concerne les alias est que env est une command externe, donc il n'a pas de «connaissance» des alias: les alias sont une construction shell qui ne fait pas partie du model de process normal et n'a aucun impact sur les programmes qui sont directement exécuté par des programmes non-shell (comme env ). env transmet simplement le program and arguments à un appel exec (comme execvp , qui searchra le program PATH).

En gros, l'utilisation d' env comme ceci est un moyen (pour la plupart) indépendant des shell d'éviter les alias, les fonctions shell, les commands shell embeddedes et tout autre élément de shell qui pourrait replace ou replace les arguments de position de command bien sûr, env est un alias, ou une fonction shell! Si vous êtes inquiet de l'existence d'un alias, vous pouvez préciser le path complet (par exemple /usr/bin/env , bien que cela puisse varier).

Une autre utilisation importante d' env (en dehors de contourner la search d'alias de command) est qu'elle search le PATH pour la command. Ceci est important lorsque des paths absolus sont nécessaires, mais varient d'un système à l'autre.

Par exemple, démarrer un script Bash avec #!/bin/bash est correct, alors que #!bash ne l'est pas, bien que /bin soit inclus dans le PATH sur tous les systèmes raisonnables.

Je l'ai souvent rencontré dans les programmes Python, qui commencent généralement par #!/usr/bin/env python pour éviter de spécifier le path complet de l'exécutable python (note, cependant, cela nécessite toujours que env trouve dans /usr/bin , c'est cependant beaucoup plus courant que l'location du binary python).