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 info
et ainsi de man
suite env
, mais je n'ai pas trop compris.
Que env
fait-on et env <command>
sans aucun argument pour env
lui-même?
env <command>
,command <command>
et\<command>
. À mon avis, si un test ditenv <command>
est invalide, alors ce test est cassé.command
ouenv
qui ferait "\" la seule réponse acceptable.man
n’ai pas compris ce qui se passaitenv
exactement. Après ce post - c'est clair et ma réponse a été examinée (acceptée). Merci à tous!Réponses:
Cette commande
exécute la commande
program and args
avec un environnement formé en étendant l'environnement actuel avec les variables d'environnement et les valeurs désignées parname=value
etname2=value2
. Si vous n'incluez pas d'argument tel quename=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 PATHprogram
).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,
env
est 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).la source
Une autre utilisation importante de
env
(à part le contournement de la recherche d’alias de commande) est qu’elle recherchePATH
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
est bien, alors que ce#!bash
n’est pas le cas, bien qu’il/bin
soit inclus dansPATH
tous 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'python
exécutable (notez toutefois qu'il nécessite toujours deenv
résider/usr/bin
, ce qui est toutefois beaucoup plus courant que l'emplacement du python. binaire).la source