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 -i puede funcionar de manera diferente si faltan las rutas de certificados, variables regionales y de proxy.
  • El shebang de /usr/bin/env se ve afectado por PATH, 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.