¿Cómo enumerar todos los nombres de variables y sus valores actuales?


348

¿Cómo enumerar todos los nombres de variables y sus valores actuales?

Incluyendo no solo $HOME, $PWDetc. , sino cualquier otro que haya definido.



Has aceptado una respuesta incorrecta. "printenv" solo te da las variables de entorno. Si realmente desea que todas las variables declaradas actualmente en su shell, use "declare -p" o "typeset -p".
Florin Andrei

Respuestas:


479

Para bash: (el shell estándar en Ubuntu)

Ingrese el siguiente comando en una terminal para imprimir todas las variables de entorno:

printenv

Para obtener más información sobre este comando, lea la printenvpágina de manual .


Para mostrar una lista que incluya las "variables de shell" puede ingresar el siguiente comando:

( set -o posix ; set ) | less

Esto le mostrará no solo las variables de shell, sino también las variables de entorno.

Para obtener más información relacionada con este tema, lea:


Para zsh: (un shell avanzado)

Use el siguiente comando:

( setopt posixbuiltin; set; ) | less

Para obtener más información sobre las opciones de ZSH, consulte la zshoptionspágina de manual .


14
Si voy al terminal y escribo MYNEWVARIABLE=Ubuntuy ejecuto printenv, no se muestra allí. ¿Por qué es eso y cómo aparecen esos otros?
Strapakowsky

44
Probablemente esté viendo la diferencia entre una variable de shell y una variable de entorno. Inténtalo export MYNEWVARIABLE=Ubuntuy funcionará como esperas.
Rmano

3
si simplemente ejecuta set, también enumera la variable creada por usted. O hacerset | grep myvar
Sergiy Kolodyazhnyy

44
printenves un comando externo, por lo que solo conoce (e imprime) las variables de entorno exportadas. setes un comando bash interno, por lo que muestra todas las "variables de shell" (variables de entorno no exportadas), así como las variables de entorno exportadas.
Dan Pritts

1
Para ampliar la respuesta de @ Rmano a @Strapakowsky ... Esto no funcionará unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, pero sí unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, y esto sí unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. El uso de export dice "la variable que estoy configurando debe ser parte del entorno que se pasa a los procesos, no solo una variable en este shell". Mi tercer ejemplo dice que "la variable debería ser parte del entorno que se pasa a ESTE proceso, pero no quedarse después".
Bruno Bronosky

52

Sé que esta pregunta es bastante antigua y respondió, pero creo que puedo agregar un poco de información útil.

En todos los métodos descritos anteriormente, el procedimiento sugerido es:

  • lanzar una terminal
  • mostrar las variables de entorno usando env, printenvo lo que sea

El problema de estas soluciones es que está viendo las variables de entorno del shell que se ejecuta en el terminal . No está viendo las variables de entorno disponibles para una aplicación ejecutada, por ejemplo, directamente por la interfaz gráfica.

Esto es notable si, por ejemplo, usa su ~/.profile, o .bashrc, o .zshenv(dependiendo de su shell) para modificar las variables de entorno --- como la clásica adición de directorios a la ruta.

Para ver las variables de entorno disponibles para la aplicación iniciadas directamente en el entorno gráfico, puede hacer lo siguiente (en Gnome Shell, estoy seguro de que hay un método equivalente en todos los demás DE):

  • presione Alt-F2
  • ejecuta el comando xterm -e bash --noprofile --norc

(O, si no lo tienes xterm, gnome-terminal -- bash --noprofile --norc--- gracias a @Mike Nakis por el comentario).

Ahora tiene un terminal con un shell que no agregó ninguna variable de entorno. Puede usar envaquí para enumerar todas sus variables de entorno:

Ejemplo de la cáscara desnuda

Obviamente, el nuevo shell tendrá las variables de entorno agregadas por los archivos del sistema, pero esas variables deberían estar disponibles (por herencia) para todos los programas en el sistema de todos modos.

Estoy publicando esto porque es la cuarta vez que tengo que buscar este truco nuevamente, revisando mi .pam_environmentarchivo. Así que ahora lo encontraré más rápido (y en el proceso, espero ayudar a alguien más ...)


Requiere que tenga un entorno de escritorio, que no es útil para las personas que solo usan CLI del servidor.
K7AAY

55
Sí --- pero para CLI solo la respuesta anterior está bien. Solo estaba señalando que en algún momento debe verificar las variables de entorno disponibles para la aplicación iniciada por el entorno gráfico, que no es el mismo conjunto que ve cuando inicia un terminal en él. Por ejemplo, si está tratando de entender por qué su aplicación Kile no puede compilar un archivo LaTeX, mientras que en un terminal puede hacerlo, el truco que publiqué aquí será de gran ayuda.
Rmano

3
Gracias por una respuesta muy útil! Acabo de vincularlo desde help.ubuntu.com/community/…
Gunnar Hjalmarsson el

Gracias. ¿Recomienda xterm -e bash --noprofile --norcporque los archivos de inicio no se leen y ejecutan cuando Ubuntu se inicia con la interfaz gráfica? Ver askubuntu.com/q/1025845/1471
Tim

1
el comando correcto para ejecutar hoy en día (Ubuntu 18.04) esgnome-terminal -- bash --noprofile --norc
Mike Nakis

45

Puede ver todas las variables con el declareincorporado.

declare -p

Si solo le interesan las variables de entorno, use

declare -xp

Corre help declarepara ver cuáles son las otras opciones.


esta es una solución mucho más ordenada que POSIXLY_CORRECT=1 sety también es digna de mencionar que declarees alias(en ese contexto) para typeset, otro bash incorporado.

1
Esta es la respuesta correcta.
Florin Andrei

12

Para enumerar las variables de entorno en la terminal con CTRL+ ALT+ T, puede usar el envcomando.

por ejemplo :

[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja

etc.

Espero que ayude.


He notado que env pierde algunas variables o_O. específicamente después de obtener un archivo VAR = VAL.
ThorSummoner

1
@ThorSummoner La respuesta aquí podría ayudar a stackoverflow.com/questions/15474650/…
georaldc

7

En bash usando compgen:

compgen -v | while read line; do echo $line=${!line};done  

2
Esta debería ser la respuesta aceptada, ya que todas las demás enumeran más que solo el nombre en sí. En mi caso, algunas variables contienen valores de varias líneas que hacen que las otras soluciones no sean factibles.
Mene

1
Una variante:compgen -v | while read line; do declare -p $line; done
Eljay

4

La mayoría de las soluciones aquí imprimen solo variables de entorno o tienen el inconveniente de que env o (set -o posix; posix) no imprimen valores en forma analizable (intente imprimir la variable A = $ 'a \ r \ nb' ...) .

Aquí hay una función que imprimirá todas las variables, una variable por línea, en la forma de escape POSIX:

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}

Gracias a @tmgoblin por señalar el uso de compgen -v.


1
Excelente primera respuesta! +1 ¡ Sigan con el buen trabajo!
Fabby

3

env es una manera POSIX 7 :

export asdf=qwer
env | grep asdf

Salida de muestra:

asdf=qwer

Solo muestra las variables exportadas: las variables no exportadas generalmente no se consideran "variables de entorno".

Prefiero eso sobre printenv, que no es POSIX. Ambos parecen hacer lo mismo sin argumentos: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv


Ya mencionado hace dos años: askubuntu.com/a/276162/158442
muru

@muru lo suficientemente justo. Ojalá hubiera sido envmás visible con un mejor formato, y he agregado más información.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Para eso es la edición .
muru

2

Si desea una variable de entorno específica, en lugar de imprimirlas todas printenv, puede imprimirla haciendoecho "$PWD"


0

printenv solo enumera las variables exportadas, command+ alt+ $ ("\ e $": complete-variable) enumerará todas las variables.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.