Linux / Comando printenv: consultar variables de entorno y su estado
printenv es un comando de GNU Coreutils que imprime el valor de una variable en el entorno del proceso actual. Si se especifica el nombre de la variable, solo se muestra el valor necesario; si se omite el nombre, se imprimirán todas las variables de entorno.
A diferencia de env, que ejecuta comandos en un entorno modificado, printenv se centra en la consulta. Es útil para verificar la diferencia entre variables de shell y variables de entorno o para comprobar si una variable se ha pasado en un script.
¿Qué es el comando printenv?
El programa recibe un conjunto de variables de entorno del proceso padre. printenv imprime en la salida estándar todos los elementos o el valor del nombre especificado del entorno que le fue entregado.
Las variables que existen solo dentro de la shell y que no fueron procesadas por export no forman parte del entorno, por lo que no son visibles con printenv.
Sintaxis básica
printenv [OPCIONES] [VARIABLE...]
Si se ejecuta sin un nombre de variable, se imprimirán todas las variables de entorno en la forma NOMBRE=VALOR.
printenv
printenv | sort
El entorno completo puede incluir tokens de autenticación o información de acceso a servicios. Antes de compartir los resultados o guardarlos en un registro, asegúrese de que no haya elementos sensibles.
Verificar una variable de entorno específica
printenv HOME
printenv PATH
printenv LANG
Si asigna un nombre de variable, solo se imprimirá el valor y no se añadirá el prefijo NOMBRE=. También puede especificar varios nombres a la vez.
printenv HOME SHELL USER
Solo con la salida puede ser difícil distinguir a qué variable corresponde cada línea, por lo que si es un informe legible por humanos, considere también una forma de mostrar los nombres por separado.
Comprobar el estado de finalización para saber si la variable existe
GNU printenv devuelve 0 si encuentra todas las variables especificadas, 1 si no encuentra al menos una y 2 si ocurre un error de escritura.
if printenv APP_ENV >/dev/null; then
printf '%s\n' 'APP_ENV is exported'
else
printf '%s\n' 'APP_ENV is not exported'
fi
Incluso las variables de entorno con valor cadena vacío se consideran “variables que existen”. Para distinguir entre un valor vacío y una variable que no existe, debe comprobar tanto el estado de finalización como la salida.
Casos en los que existe la variable de shell pero no aparece en printenv
APP_MODE=development
printf '%s\n' "$APP_MODE"
printenv APP_MODE
Ejecute este ejemplo en una shell Bash de práctica donde APP_MODE no exista ni esté exportada. En ese caso, la asignación crea una variable local y el primer printenv APP_MODE no la encuentra: su estado esperado es 1. Si el nombre ya estaba exportado, asignarle otro valor conserva normalmente ese atributo y el resultado sería diferente.
export APP_MODE
printenv APP_MODE
Después de export APP_MODE, el proceso hijo que ejecuta printenv recibe el valor development. La exportación afecta a los hijos que se creen a partir de esa shell; no modifica retrospectivamente otros procesos ni sus entornos.
Ver los elementos PATH línea por línea
PATH es una lista de directorios separados por dos puntos, por lo que se puede dividir para que sea más fácil de leer de la siguiente manera.
printenv PATH | tr ':' '\n'
Los elementos vacíos pueden significar el directorio actual, lo que puede representar un problema de seguridad. Compruebe también si hay dos puntos al principio, al final o consecutivos en la salida.
Separar con carácter NUL con -0
printenv -0
printenv --null
-0 o --null imprimen un carácter NUL al final de cada elemento en lugar de un salto de línea. Esto es útil cuando el valor de la variable de entorno en sí puede contener saltos de línea y otro programa necesita procesar los resultados sin ambigüedades.
printenv -0 | while IFS= read -r -d '' item; do
printf '%q\n' "$item"
done
El uso de read -d en este ejemplo se basa en Bash. Las herramientas de texto simples pueden no soportar entrada separada por NUL, así que asegúrese de que toda la canalización pueda manejar este formato.
Opciones compatibles
| Opciones | Descripción |
|---|---|
-0, --null |
Termina cada elemento de salida con un carácter NUL en lugar de un salto de línea. |
--help |
Imprime el manual de uso y finaliza. |
--version |
Imprime la versión del programa y finaliza. |
-0 es una función de GNU Coreutils. Puede variar en otros sistemas tipo Unix si es admitida o no.
Comparar printenv, env y printf
| Comando | Objetivo de verificación | Características |
|---|---|---|
printenv NAME |
Variables de entorno pasadas al proceso hijo | Es útil para verificar la existencia de una variable de entorno específica a través del estado de salida. |
env |
Todo el entorno actual | La función principal es cambiar el entorno para ejecutar otros comandos. |
printf '%s\n' "$NAME" |
El valor de la variable que el shell ha expandido actualmente | También se pueden mostrar las variables del shell que no se han exportado al entorno. |
Aunque también se puede ver el valor de echo "$NAME", en los scripts printf es más predecible si se quiere evitar diferencias de implementación relacionadas con valores que parecen opciones o el tratamiento de la barra invertida.
Comprobar temporalmente el entorno establecido
Si se utiliza junto con env, se pueden verificar los valores que se pasarán a un comando específico.
env APP_ENV=staging printenv APP_ENV
env -u HTTP_PROXY printenv HTTP_PROXY
El segundo comando no produce ninguna salida y devuelve un estado de error porque la variable ha sido eliminada.
Razón por la que los valores son diferentes para cada proceso
El entorno no es una tabla única para todo el sistema, sino los datos que posee cada proceso. Un nuevo terminal, sesión SSH, servicio systemd, tarea cron y contenedor utilizan diferentes procesos padre y configuraciones de inicio, por lo que incluso si los nombres de las variables son los mismos, los valores pueden ser diferentes o no existir.
Al diagnosticar problemas, debe ejecutar printenv en el mismo entorno de usuario, servicio o contenedor donde se ejecuta el programa real. No se debe asumir que los valores visibles en el terminal se transmiten automáticamente al servicio.
Precauciones de seguridad al mostrar variables de entorno
- No se debe publicar el resultado completo de
printenven problemas públicos ni en chats. - Verifique si los tokens y contraseñas están enmascarados en los registros de CI.
- Especifique solo los nombres de variables necesarios para consultar solo los valores mínimos.
- Al verificar si se necesita un valor secreto, no exponga el valor; utilice el estado de salida.
- Las variables de entorno pueden estar expuestas a herramientas de depuración con los mismos permisos o a procesos hijos, por lo que no se deben considerar un almacén de secretos por sí mismas.
Problemas comunes
He configurado un valor, pero no se muestra.
Es muy probable que solo haya creado la variable de shell y no haya ejecutado export. Verifíquelo en un nuevo proceso hijo después de ejecutar export NOMBRE.
¿Se imprimió una línea vacía, significa que la variable no existe?
Puede ser difícil distinguir solo mirando la pantalla entre una variable configurada como cadena vacía y una que no existe. Verifique el estado de finalización del comando.
printenv EMPTY_VALUE
printf 'status=%s\n' "$?"
Las variables de entorno desaparecen después de sudo.
sudo elimina o restringe las variables de entorno según la política de seguridad. En lugar de forzar su preservación, revise solo las variables necesarias para la política sudoers y el comando objetivo.
Preguntas frecuentes
¿printenv muestra todas las variables del shell actual?
No. Solo muestra las variables exportadas al entorno. Las variables locales de Bash, los arrays y algunas variables especiales deben verificarse con comandos internos del shell como declare o set.
¿Se puede imprimir juntos el nombre y el valor de una variable específica?
printenv NAME solo imprime el valor. Si necesita también el nombre, puede configurarlo como printf 'NAME=%s\n' "$(printenv NAME)", pero dado que la sustitución de comandos elimina el salto de línea final, se debe tener cuidado al trabajar en tareas que requieren conservar el valor original tal cual.
¿Se pueden cambiar las variables de entorno con printenv?
No. printenv es un comando de consulta. En la shell actual, use asignaciones y export, y si desea aplicarlo solo a un comando, use env NOMBRE=VALOR COMANDO.
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 printenv y Manual de GNU Coreutils: invocación de env.




