¿Cómo veo una lista de todas las variables de entorno definidas actualmente en una terminal bash de Linux?

¿Cómo veo una lista de todas las variables de entorno definidas actualmente en una terminal bash de Linux?

En una terminal bash de Linux, a menudo se han configurado muchas variables de entorno, como $PATHy $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 setcomando incorporado para mostrar todas las variables de entornoque se han fijado. El setcomando 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 envcomando; sin embargo, este comando no proporcionará una lista completa de las variables de entorno. envsolo mostrará las variables que han sido marcadas para exportación. Compare el resultado de env | sorty export -py 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 enves un ejecutable independiente y no setun 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 setcomando 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 setproporciona resultados mientras envque no.

Respuesta2

El envcomando 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).
  • -zcondición: compruebe si el valor es nulo; de lo contrario, imprima "variable = valor".

Nota: printenvtambién es genial, pero solo mostrará una lista de variables de entorno que se han exportado, no variables locales/bash.

información relacionada