Como listar todos os nomes de variáveis e seus valores atuais?
Incluindo não apenas etc $HOME
, $PWD
mas qualquer outro que você definiu.
Como listar todos os nomes de variáveis e seus valores atuais?
Incluindo não apenas etc $HOME
, $PWD
mas qualquer outro que você definiu.
Respostas:
Para o bash: (o shell padrão no Ubuntu)
Digite o seguinte comando em um terminal para imprimir todas as variáveis de ambiente:
printenv
Para mais informações sobre este comando, leia a printenv
página de manual .
Para mostrar uma lista incluindo as "variáveis de shell", você pode inserir o próximo comando:
( set -o posix ; set ) | less
Isso mostrará não apenas as variáveis do shell, mas também as variáveis de ambiente.
Para obter mais informações relacionadas a este tópico, leia:
Para zsh: (um shell avançado)
Use o seguinte comando:
( setopt posixbuiltin; set; ) | less
Para obter mais informações sobre as opções do ZSH, consulte a zshoptions
página de manual .
MYNEWVARIABLE=Ubuntu
e executar, printenv
ele não aparecerá lá. Por que isso e como os outros aparecem?
export MYNEWVARIABLE=Ubuntu
e funcionará conforme o esperado.
set
, ele lista a variável criada por você também. Ou façaset | grep myvar
printenv
é um comando externo; portanto, ele conhece apenas (e imprime) as variáveis de ambiente exportadas. set
é um comando bash interno, portanto, mostra todas as "variáveis de shell" (variáveis de ambiente não exportadas), bem como as variáveis de ambiente exportadas.
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
, mas funcionará unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
e funcionará unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW
. O uso da exportação diz que "a variável que estou configurando deve fazer parte do ambiente que é passado aos processos, não apenas uma variável nesse shell". Meu terceiro exemplo diz que "a variável deve fazer parte do ambiente que é passado para ESTE processo, mas não permanecer depois".
Eu sei que esta pergunta é bastante antiga e respondeu, mas acho que posso adicionar um pouco de informação útil.
Em todos os métodos descritos acima, o procedimento sugerido é:
env
, ou
printenv
ou qualquer outra coisaO problema dessas soluções é que você está vendo as variáveis de ambiente do shell que está sendo executado no terminal . Você não está vendo as variáveis de ambiente disponíveis para um aplicativo, por exemplo, diretamente pela interface gráfica.
Isso é perceptível se, por exemplo, você usar seu ~/.profile
, ou .bashrc
, ou .zshenv
(dependendo do seu shell) para modificar as variáveis de ambiente - como a adição clássica de diretórios ao caminho.
Para ver as variáveis de ambiente disponíveis para o aplicativo iniciadas diretamente no ambiente gráfico, você pode fazer o seguinte (no Gnome Shell, tenho certeza de que existe um método equivalente em todos os outros DE):
xterm -e bash --noprofile --norc
(Ou, se você não tiver xterm
, gnome-terminal -- bash --noprofile --norc
--- obrigado a Mike Nakis pelo comentário).
Agora você tem um terminal com um shell que não adicionou nenhuma variável de ambiente. Você pode usar env
aqui para listar todas as suas variáveis de ambiente:
Obviamente, o novo shell terá as variáveis de ambiente adicionadas pelos arquivos do sistema, mas essas variáveis deverão estar disponíveis (por herança) para todos os programas do sistema.
Estou postando isso porque é a quarta vez que tenho que pesquisar esse truque novamente, verificando meu .pam_environment
arquivo. Então agora vou encontrá-lo mais rápido (e, no processo, espero ajudar outra pessoa ...)
xterm -e bash --noprofile --norc
porque os arquivos de inicialização não são lidos e executados quando o Ubuntu é iniciado com a interface gráfica? Veja askubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
Você pode ver todas as variáveis com o declare
builtin.
declare -p
Se você estiver interessado apenas em variáveis de ambiente, use
declare -xp
Corra help declare
para ver quais são as outras opções.
POSIXLY_CORRECT=1 set
e também é digno de menção que declare
é alias
(nesse contexto) para typeset
, outro bash embutido.
Para listar as variáveis de ambiente no terminal com CTRL+ ALT+, Tvocê pode usar o env
comando
por exemplo :
[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 ajude.
No bash usando compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
A maioria das soluções aqui imprime apenas variáveis de ambiente ou tem a desvantagem de que env ou (set -o posix; posix) não imprimem valores na forma analisável (tente imprimir a variável A = $ 'a \ r \ nb' ...) .
Aqui está uma função que imprimirá todas as variáveis, uma variável por linha, no formulário de escape POSIX:
function dump_vars {
local VARNAME
compgen -v | while read -r VARNAME; do
printf "$VARNAME=%q\n" "${!VARNAME}"
done
}
Obrigado a @tmgoblin por apontar o uso do compgen -v.
env é uma maneira POSIX 7 :
export asdf=qwer
env | grep asdf
Saída de amostra:
asdf=qwer
Ele mostra apenas variáveis exportadas: variáveis não exportadas geralmente não são consideradas "variáveis de ambiente".
Prefira que over printenv
, que não é POSIX. Ambos parecem fazer a mesma coisa sem argumentos: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv
env
mais visível com melhor formatação e adicionei mais informações.
O printenv lista apenas variáveis exportadas, command+ alt+ $ ("\ e $": variável completa) lista todas as variáveis.