En un terminal bash de Linux, a menudo hay muchas variables de entorno que se han establecido, como $PATH
y $HOME
.
¿Es posible ver todas las variables de entorno que se han establecido? ¿Cómo?
En un terminal bash de Linux, a menudo hay muchas variables de entorno que se han establecido, como $PATH
y $HOME
.
¿Es posible ver todas las variables de entorno que se han establecido? ¿Cómo?
Respuestas:
TL; DR: uso(set -o posix ; set)
De acuerdo con el manual de Bash, puede usar el set
comando incorporado para mostrar todas las variables de entorno que se han establecido. 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 fácil de hacerlo es con set -o posix
, pero eso dejará el modo POSIX activado hasta que lo desactive 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 variables de entorno. env
solo mostrará los objetos valiosos que se han marcado para la exportación. Compare la salida de env | sort
y export -p
verá lo que quiero decir. Puede ejecutar comm -23 <(set -o posix; set) <(env|sort)
si desea ver qué variables de entorno no se están exportando.
La razón de la discrepancia es que env
es un ejecutable separado en lugar de set
un comando incorporado de shell. De acuerdo con 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 se han marcado 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 utilizando los siguientes comandos.
MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE
Verá que set
proporciona salida mientras env
que no.
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 solo se usan dentro del shell en ejecución, por ejemplo, para la configuración.
printenv
, ya que ambos env
y set
tienen otras funciones que simplemente dar salida al entorno.
env
solo imprimirá una lista de variables de entorno que se hayan marcado para la exportación. No imprimirá todas las variables.
compgen -v
imprime variables de shell (pero no los valores).
compgen -e
imprime variables exportadas, es decir, aquellas que se heredan mediante procesos que inicia este shell (pero no sus valores).
Diferencia entre el shell y las variables exportadas: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
compgen -e
es exactamente lo que quería!