Linux / Comando env: ejecutar programas con variables de entorno específicas
env es un comando de GNU Coreutils que verifica las variables de entorno o ejecuta un comando con algunas variables de entorno añadidas, modificadas o eliminadas. Es particularmente útil cuando se desea pasar un entorno diferente solo a un proceso específico sin cambiar directamente el shell actual.
Si se ejecuta sin argumentos, imprime el entorno actual que se pasa; sin embargo, si solo se necesita consultar, printenv muestra la intención más claramente. El uso principal de env es “ejecutar un comando en un entorno modificado”.
¿Qué es el comando env?
Los procesos reciben un conjunto de variables de entorno del proceso padre. env construye un nuevo entorno basado en este conjunto, agregando o eliminando variables, y luego ejecuta el comando especificado. Los cambios pueden propagarse al proceso hijo ejecutado y a sus descendientes, pero el entorno del shell original no cambia.
Sintaxis básica
env [OPCIONES] [NOMBRE=VALOR]... [COMANDO [ARGUMENTO]...]
Si no se especifica un comando, se imprime el entorno resultante.
env
env | sort
Como las variables de entorno pueden incluir valores secretos, no publique toda la salida tal cual en una publicación, solicitud de soporte o registro público.
Configurar variables de entorno solo para un comando
env APP_ENV=production ./start.sh
env LANG=C sort names.txt
Las variables se aplican al comando hijo y no cambian las de la shell padre. ./start.sh y ./server son ejemplos de programas que ya debe tener; env no los crea ni les añade permisos. Para practicar sin una aplicación externa, ejecute env APP_ENV=production printenv APP_ENV: debe mostrar production. El ejemplo con sort requiere un archivo names.txt preparado. LANG=C no anula un LC_ALL o LC_COLLATE heredado; para fijar la ordenación C de esa prueba, puede usar env LC_ALL=C sort names.txt.
printenv APP_ENV
Se pueden especificar varias variables en orden de izquierda a derecha.
env HOST=127.0.0.1 PORT=8080 DEBUG=1 ./server
Comparación entre la asignación del shell actual y env
En shells de la familia POSIX, se puede establecer el entorno de un comando mismo si se antepone directamente NOMBRE=VALOR al comando.
LANG=C sort names.txt
env LANG=C sort names.txt
En casos simples, los resultados de ambos formatos son similares. env es útil cuando se necesitan funciones adicionales como vaciar el entorno, eliminar variables, cambiar el directorio de trabajo o buscar el intérprete de scripts.
Ejecutar con el entorno vaciado usando -i
env -i /usr/bin/printenv
-i o --ignore-environment ignoran el entorno existente y comienzan en un entorno vacío. Es útil para pruebas de reproducibilidad o para encontrar dependencias ocultas del entorno, pero PATH, HOME y variables relacionadas con localización y autenticación también pueden desaparecer.
Se pueden volver a ejecutar especificando explícitamente solo las variables necesarias.
env -i PATH=/usr/bin:/bin HOME="$HOME" LANG=C /usr/bin/env
Si PATH no está presente, la búsqueda de comandos puede fallar, por lo que se recomienda usar rutas absolutas o especificar las rutas necesarias junto con el comando.
-u para eliminar solo variables específicas
env -u HTTP_PROXY curl https://example.com
env --unset=DEBUG ./start.sh
-u NOMBRE o --unset=NOMBRE elimina solo esa variable del entorno hijo. Quitar HTTP_PROXY no desactiva por sí solo todos los proxies: pueden seguir influyendo HTTPS_PROXY, ALL_PROXY, variantes en minúsculas o la configuración propia de la aplicación. El ejemplo demuestra la eliminación de una variable, no garantiza una conexión directa.
Establecer una variable con una cadena vacía y eliminarla son cosas diferentes.
env DEBUG= ./start.sh
env -u DEBUG ./start.sh
Dependiendo del programa, “la variable existe pero su valor está vacío” y “la variable no existe” pueden ser tratados de manera diferente.
-C para ejecutar en otro directorio
env -C /srv/app ./start.sh
env --chdir=/srv/app APP_ENV=production ./start.sh
-C o --chdir de GNU env cambian al directorio especificado y luego ejecutan el comando. El directorio de trabajo del shell actual no cambia. Esta opción es una extensión de GNU, así que si necesita portabilidad en sus scripts, verifique si es compatible.
Opciones de uso frecuente
| Opciones | Descripción |
|---|---|
-i, --ignore-environment |
Comienza desde un entorno vacío ignorando el entorno existente. |
-u NOMBRE, --unset=NOMBRE |
Elimina las variables especificadas en el entorno de resultados. |
-C DIRECTORIO, --chdir=DIRECTORIO |
Después de cambiar al directorio especificado, ejecuta el comando. |
-S CADENA, --split-string=CADENA |
Divide una cadena en varios argumentos. Se usa principalmente al pasar varios argumentos en shebang. |
-0, --null |
Al imprimir el entorno, separa los elementos con el carácter NUL en lugar de salto de línea. |
Las opciones compatibles pueden variar según la versión de Coreutils. Consulte tanto la env --help de la distribución como el manual oficial.
Uso de /usr/bin/env en la primera línea del script
Puede hacer que el intérprete en el shebang del script se busque con PATH.
#!/usr/bin/env python3
Es útil en entornos de desarrollo donde el intérprete puede estar instalado en diferentes rutas según el sistema. Sin embargo, ejecuta primero el programa que se encuentra en la PATH actual, por lo que en servicios del sistema donde la seguridad y la reproducibilidad son importantes, una ruta absoluta verificada puede ser más adecuada.
Pasar múltiples argumentos al intérprete
En un entorno donde GNU Coreutils admite -S, la cadena shebang puede dividirse en varios argumentos.
#!/usr/bin/env -S python3 -I
La opción -S y el tratamiento de la línea shebang dependen de la implementación y del sistema operativo. Si necesita portabilidad, compruebe ambos o utilice un lanzador que invoque el intérprete y sus argumentos explícitamente. env -i limpia el entorno heredado, pero no crea por sí solo aislamiento de permisos, archivos o red.
Diferencias entre variables de shell y variables de entorno
Use el ejemplo siguiente en una shell Bash de práctica donde LOCAL_ONLY no exista ni esté exportada. El primer printenv debe terminar con estado 1 y el segundo mostrar value. Si una variable ya estaba exportada, reasignarla normalmente conserva ese atributo.
LOCAL_ONLY=value
printenv LOCAL_ONLY
export LOCAL_ONLY
printenv LOCAL_ONLY
Solo las variables export se incluyen en el entorno de un programa recién ejecutado. env funciona según el entorno que se le pasó, no toda la variable de la shell actual.
Comparación entre env y printenv
| Clasificación | env |
printenv |
|---|---|---|
| Objetivo principal | Ejecutar comandos en un entorno modificado | Consulta del valor de la variable de entorno |
| Impresión de todo el entorno | Es posible si se omite el comando | Es posible si se omite el nombre de la variable |
| Consulta de una variable específica | No hay un formato exclusivo, se necesita un filtro. | Se consulta directamente como printenv HOME. |
| Agregar o eliminar variables | Se aplica. | No se aplica. |
| Ejecución de comandos | Se aplica. | No se aplica. |
Precauciones de seguridad y operación
- No registre en los logs todo el entorno que incluya tokens, contraseñas y rutas de claves privadas.
- Si escribe valores secretos directamente en
env NOMBRE=VALOR COMANDO, debe considerar la posibilidad de que se expongan en el historial de la shell o en la información de los procesos. - La autenticación con
env -ipuede funcionar de manera diferente si faltan las rutas de certificados, variables regionales y de proxy. - El shebang de
/usr/bin/envse ve afectado porPATH, por lo que debe asegurarse de que la cuenta que ejecuta y el entorno sean confiables. - Si es posible, el entorno del servicio utiliza la función de configuración explícita del entorno del administrador del servicio.
Preguntas frecuentes
¿Las variables configuradas con env permanecen en la terminal actual?
No. env NOMBRE=VALOR COMANDO solo cambia el entorno del comando que se ejecuta y no modifica las variables del shell padre.
¿Cuál es la diferencia entre env y export?
export marca la variable del shell actual para que se exporte al entorno de los procesos hijos ejecutados posteriormente. env es adecuado para configurar el entorno para la ejecución de un solo comando.
En env -i no se encuentra el comando.
Puede ser porque incluso PATH haya sido eliminado. Use la ruta absoluta del ejecutable o configure explícitamente el PATH necesario.
Para comparar otras herramientas, consulte la Lista de comandos de uso frecuente en Linux. Para consultar las reglas y opciones, use Manual de GNU Coreutils: invocación de env y Definición de variables de entorno POSIX.




