¿Qué está env ls -al
haciendo el comando ?
Tuve una prueba de Linux y había una pregunta: "¿Cómo ejecutar el comando directamente, pero no su alias?"
Sabía que existe una solución como el comando de prefijo con algún símbolo especial, pero lo olvidé. Ahora sé que lo es \
. (Leer de esta publicación ).
Pero también recuerdo que en algún lugar leí que para deshacernos del alias podemos prefijar un comando con env
. Lo hice y parece que funciona, pero mi respuesta fue calificada como incorrecta. He leído info
y man
sobre env
, pero no entendía demasiado.
¿Qué está env
haciendo y exactamente env <command>
sin ningún argumento en env
sí mismo?
env <command>
,command <command>
y\<command>
. En mi opinión, si alguna prueba diceenv <command>
que no es válida, entonces esa prueba está rota.command
oenv
que sería la única respuesta aceptable.man
y no entendí qué estabaenv
haciendo exactamente. Después de esta publicación, está claro y mi respuesta fue revisada (aceptada). ¡Gracias a todos!Respuestas:
Este comando
ejecuta el comando
program and args
con un entorno formado al extender el entorno actual con las variables de entorno y los valores designados porname=value
yname2=value2
. Si no incluye ningún argumento comoname=value
, entonces el entorno actual se pasa sin modificaciones.Lo clave que sucede con respecto a los alias es que env es un comando externo, por lo que no tiene "conocimiento" de los alias: los alias son una construcción de shell que no son parte del modelo de proceso normal y no tienen impacto en los programas que son directamente ejecutado por programas que no son de shell (como env ). env simplemente pasa el
program and arguments
a una llamada ejecutiva (como execvp , que buscará la RUTAprogram
).Básicamente, usar env de esta manera es una forma (en su mayoría) independiente de shell de evitar alias, funciones de shell, comandos incorporados de shell y cualquier otro bit de funcionalidad de shell que pueda reemplazar o anular los argumentos de posición de comando (es decir, nombres de programas), a menos que, ¡por supuesto,
env
es un alias o función de shell! Si le preocupaenv
ser un alias, puede explicar la ruta completa (por ejemplo/usr/bin/env
, aunque puede variar).fuente
Otro uso importante de
env
(además de eludir la búsqueda de alias de comando) es que busca elPATH
el comando. Esto es importante cuando se requieren rutas absolutas, pero varían de un sistema a otro.Por ejemplo, comenzar un script Bash con
#!/bin/bash
está bien, mientras#!bash
que no lo está, a pesar de/bin
estar incluido enPATH
todos los sistemas razonables.Frecuentemente me encontré con esto en los programas de Python, que generalmente comienzan
#!/usr/bin/env python
para evitar especificar la ruta completa y dependiente del sistema delpython
ejecutable (tenga en cuenta, sin embargo, que todavía requiere queenv
resida/usr/bin
, sin embargo, esto es mucho más común que la ubicación de la pitón binario).fuente