Como listar todos os nomes de variáveis ​​e seus valores atuais?

348

Como listar todos os nomes de variáveis ​​e seus valores atuais?

Incluindo não apenas etc $HOME, $PWDmas qualquer outro que você definiu.

Strapakowsky
fonte
Você aceitou uma resposta incorreta. "printenv" fornece apenas as variáveis ​​de ambiente. Se você realmente deseja todas as variáveis ​​atualmente declaradas no seu shell, use "declare -p" ou "typeset -p".
Florin Andrei

Respostas:

479

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 printenvpá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 zshoptionspágina de manual .

Lucio
fonte
14
Se eu for para o terminal e escrever MYNEWVARIABLE=Ubuntue executar, printenvele não aparecerá lá. Por que isso e como os outros aparecem?
Strapakowsky 30/03
4
Provavelmente você está vendo a diferença entre uma variável de shell e uma variável de ambiente. Tente export MYNEWVARIABLE=Ubuntue funcionará conforme o esperado.
Rmano
3
se você simplesmente executar set, ele lista a variável criada por você também. Ou façaset | grep myvar
Sergiy Kolodyazhnyy
4
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.
Dan Pritts 30/07/2015
1
Para expandir a resposta de @ Rmano para @Strapakowsky ... Isso não funcionará unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, mas funcionará unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWe 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".
precisa saber é o seguinte
52

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 é:

  • lançar um terminal
  • mostre as variáveis ​​de ambiente usando env, ou printenvou qualquer outra coisa

O 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):

  • pressione Alt-F2
  • execute o comando 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 envaqui para listar todas as suas variáveis ​​de ambiente:

Exemplo da casca nua

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_environmentarquivo. Então agora vou encontrá-lo mais rápido (e, no processo, espero ajudar outra pessoa ...)

Rmano
fonte
Requer que você tenha um ambiente de área de trabalho, não útil para usuários somente da CLI do servidor.
K7AAY
5
Sim --- mas para a CLI apenas a resposta anterior está ok. Eu estava apenas apontando que em algum momento você precisa verificar as variáveis ​​de ambiente disponíveis para o aplicativo iniciado pelo ambiente gráfico, que não é o mesmo conjunto que você vê quando inicia um terminal nele. Por exemplo, se você está tentando entender por que seu aplicativo Kile não pode compilar um arquivo LaTeX, enquanto em um terminal é possível, o truque que publiquei aqui ajudará bastante.
Rmano 21/10
3
Obrigado por uma resposta muito útil! Acabei de vincular a ele a partir de help.ubuntu.com/community/…
Gunnar Hjalmarsson
Obrigado. Você recomendou xterm -e bash --noprofile --norcporque 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
Tim
1
o comando certo para executar hoje em dia (Ubuntu 18.04) égnome-terminal -- bash --noprofile --norc
Mike Nakis
45

Você pode ver todas as variáveis ​​com o declarebuiltin.

declare -p

Se você estiver interessado apenas em variáveis ​​de ambiente, use

declare -xp

Corra help declarepara ver quais são as outras opções.

Geirha
fonte
esta é uma solução muito mais limpa do que POSIXLY_CORRECT=1 sete também é digno de menção que declareé alias(nesse contexto) para typeset, outro bash embutido.
1
Essa é a resposta correta.
Florin Andrei
12

Para listar as variáveis ​​de ambiente no terminal com CTRL+ ALT+, Tvocê pode usar o envcomando

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.

rɑːdʒɑ
fonte
Eu notei que o env perde algumas variáveis ​​o_O. especificamente depois de obter um arquivo VAR = VAL.
ThorSummoner
1
@ThorSummoner A resposta aqui pode ajudar stackoverflow.com/questions/15474650/…
georaldc
7

No bash usando compgen:

compgen -v | while read line; do echo $line=${!line};done  
tmgoblin
fonte
2
Essa deve ser a resposta aceita, pois todos os outros listam mais do que apenas o próprio nome. No meu caso, algumas variáveis ​​contêm valores de múltiplas linhas, o que torna as outras soluções inviáveis.
Mene
1
Uma variante:compgen -v | while read line; do declare -p $line; done
Eljay
4

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.

Ján Lalinský
fonte
1
Excelente primeira resposta! +1 Mantenha o bom trabalho!
Fabby
3

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

Ciro Santilli adicionou uma nova foto
fonte
Já mencionado há dois anos: askubuntu.com/a/276162/158442
muru
@muru justo o suficiente. Gostaria que tivesse ficado envmais visível com melhor formatação e adicionei mais informações.
Ciro Santilli escreveu:
É para isso que serve a edição .
Muru
2

Se você deseja uma variável de ambiente específica, em vez de imprimi-las todas printenv, pode, por exemplo, imprimi-la fazendoecho "$PWD"

inigo333
fonte
0

O printenv lista apenas variáveis ​​exportadas, command+ alt+ $ ("\ e $": variável completa) lista todas as variáveis.

user1133275
fonte