¿Qué está haciendo `env <command>`?

37

¿Qué está env ls -alhaciendo 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 infoy mansobre env, pero no entendía demasiado.

¿Qué está envhaciendo y exactamente env <command>sin ningún argumento en envsí mismo?

ALZ
fuente
Como nota, 3 maneras de hacer esto que se me ocurre son env <command>, command <command>y \<command>. En mi opinión, si alguna prueba dice env <command>que no es válida, entonces esa prueba está rota.
Patrick
@Patrick: No está roto porque, como dijo Chris, podría haber un alias commando envque sería la única respuesta aceptable.
Pierre Arlaud
1
@ArlaudPierre y `\` no está definido en posix (como un escape de alias), por lo que no es portátil. Entonces no es más aceptable que los demás.
Patrick
@Patrick: cierto, cierto. Ahora tendríamos que saber el perímetro exacto de la prueba para decir eso. Pero en cualquier caso, encontrar que la respuesta "env" no es aceptable no es muy honesta, tendría que estar de acuerdo con usted en eso.
Pierre Arlaud
Chicos, la prueba también fue verificada por humanos (ex-administrador de sistemas certificado por LPI, que ahora enseña otros Linux) :) Me quejé al verificador, fui many no entendí qué estaba envhaciendo exactamente. Después de esta publicación, está claro y mi respuesta fue revisada (aceptada). ¡Gracias a todos!
ALZ

Respuestas:

38

Este comando

env name=value name2=value2 program and args

ejecuta el comando program and argscon un entorno formado al extender el entorno actual con las variables de entorno y los valores designados por name=valuey name2=value2. Si no incluye ningún argumento como name=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 argumentsa una llamada ejecutiva (como execvp , que buscará la RUTA program).

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, enves un alias o función de shell! Si le preocupa envser un alias, puede explicar la ruta completa (por ejemplo /usr/bin/env, aunque puede variar).

Chris Johnsen
fuente
24

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/bashestá bien, mientras #!bashque no lo está, a pesar de /binestar incluido en PATHtodos los sistemas razonables.

Frecuentemente me encontré con esto en los programas de Python, que generalmente comienzan #!/usr/bin/env pythonpara evitar especificar la ruta completa y dependiente del sistema del pythonejecutable (tenga en cuenta, sin embargo, que todavía requiere que envresida /usr/bin, sin embargo, esto es mucho más común que la ubicación de la pitón binario).

malvado
fuente