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?
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).
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).