
En una terminal bash de Linux, a menudo se han configurado muchas variables de entorno, como $PATH
y $HOME
.
¿Es posible ver todas las variables de entorno que se han configurado? ¿Cómo?
Respuesta1
TL;DR:usar(set -o posix ; set)
Según el manual de Bash puedesuse el set
comando incorporado para mostrar todas las variables de entornoque se han fijado. El set
comando también mostrará las definiciones de cualquier función. Si solo desea ver las variables y no las funciones, puede activar el modo POSIX antes de ejecutar el comando set. La forma más sencilla de hacerlo es con set -o posix
, pero dejará activado el modo POSIX hasta que lo desactive con set +o posix
.
Por lo tanto, el siguiente comando mostrará todas las variables de entorno definidas mediante el uso de un subshell sin afectar el cumplimiento de POSIX en su shell actual.
(set -o posix ; set)
@RedGrittyBrick y @iglvzx sugirieron usar el env
comando; sin embargo, este comando no proporcionará una lista completa de las variables de entorno. env
solo mostrará las variables que han sido marcadas para exportación. Compare el resultado de env | sort
y export -p
y verá lo que quiero decir. Puede ejecutarlo comm -23 <(set -o posix; set) <(env|sort)
si desea ver qué variables de entorno no se exportan.
El motivo de la discrepancia es que env
es un ejecutable independiente y no set
un comando integrado del shell. Según el manual de Bash,cuando se ejecuta un comando que no es un comando o función incorporado en el shell, solo recibirá variables de entorno que hayan sido marcadas para exportar en Bash.. Hay muchas variables que no se exportan. Por lo tanto, si desea ver todas las variables que su shell ha definido, debe usar el set
comando como se indica en el manual.
Puede probar fácilmente este comportamiento usted mismo utilizando los siguientes comandos.
MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE
Verás que set
proporciona resultados mientras env
que no.
Respuesta2
El env
comando sin argumentos imprimirá una lista de las variables de entorno "exportadas" y sus valores. Estas variables se hacen visibles para los subprocesos; muchas otras variables de entorno no se muestran con esto y se usan dentro del shell en ejecución únicamente, por ejemplo, para configuración.
Respuesta3
compgen -v
imprime variables de shell (pero no los valores).
compgen -e
imprime variables exportadas, es decir, aquellas que son heredadas por los procesos que inicia este shell (pero no sus valores).
Diferencia entre shell y variables exportadas:https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
Respuesta4
Combinando algunas de las respuestas anteriores, encuentro útil lo siguiente:
compgen -v | sort | while read var; do [ -z "${!var}" ] || echo $var=${!var} ; done
compgen -v
: Imprime todos los nombres de las variables, ya sean locales o exportadas.sort
: Orden alfabetico.${!var}
: Obtenga el valor de $var (dirección indirecta variable).-z
condición: compruebe si el valor es nulo; de lo contrario, imprima "variable = valor".
Nota:
printenv
también es genial, pero solo mostrará una lista de variables de entorno que se han exportado, no variables locales/bash.