¿Cómo enumerar todos los nombres de variables y sus valores actuales?
Incluyendo no solo $HOME
, $PWD
etc. , sino cualquier otro que haya definido.
¿Cómo enumerar todos los nombres de variables y sus valores actuales?
Incluyendo no solo $HOME
, $PWD
etc. , sino cualquier otro que haya definido.
Respuestas:
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 printenv
pá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 zshoptions
página de manual .
MYNEWVARIABLE=Ubuntu
y ejecuto printenv
, no se muestra allí. ¿Por qué es eso y cómo aparecen esos otros?
export MYNEWVARIABLE=Ubuntu
y funcionará como esperas.
set
, también enumera la variable creada por usted. O hacerset | grep myvar
printenv
es un comando externo, por lo que solo conoce (e imprime) las variables de entorno exportadas. set
es 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.
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".
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:
env
,
printenv
o lo que seaEl 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):
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 env
aquí para enumerar todas sus variables de entorno:
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_environment
archivo. Así que ahora lo encontraré más rápido (y en el proceso, espero ayudar a alguien más ...)
xterm -e bash --noprofile --norc
porque los archivos de inicio no se leen y ejecutan cuando Ubuntu se inicia con la interfaz gráfica? Ver askubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
Puede ver todas las variables con el declare
incorporado.
declare -p
Si solo le interesan las variables de entorno, use
declare -xp
Corre help declare
para ver cuáles son las otras opciones.
POSIXLY_CORRECT=1 set
y también es digna de mencionar que declare
es alias
(en ese contexto) para typeset
, otro bash incorporado.
Para enumerar las variables de entorno en la terminal con CTRL+ ALT+ T, puede usar el env
comando.
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.
En bash usando compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
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.
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
env
más visible con un mejor formato, y he agregado más información.
printenv solo enumera las variables exportadas, command+ alt+ $ ("\ e $": complete-variable) enumerará todas las variables.