Como vejo uma lista de todas as variáveis ​​de ambiente definidas atualmente em um terminal bash do Linux?

31

Em um terminal bash do Linux, muitas vezes há muitas variáveis ​​de ambiente que foram definidas, como $PATHe $HOME.

É possível ver todas as variáveis ​​de ambiente que foram definidas? Quão?

Cory Klein
fonte

Respostas:

32

TL; DR: use(set -o posix ; set)


De acordo com o manual do Bash, você pode usar o setcomando interno para mostrar todas as variáveis ​​de ambiente que foram definidas. O setcomando também exibirá as definições de quaisquer funções. Se você deseja apenas ver as variáveis, e não as funções, é possível ativar o modo POSIX antes de executar o comando set. A maneira mais fácil de fazer isso é set -o posix, mas isso deixará o modo POSIX ativado até que você o desligue set +o posix.

Portanto, o comando a seguir mostrará todas as variáveis ​​de ambiente definidas usando um subshell sem afetar a conformidade do POSIX em seu shell atual.

(set -o posix ; set)

@RedGrittyBrick e @iglvzx sugeriram o uso do envcomando, no entanto, este comando não fornecerá uma lista completa das variáveis ​​de ambiente. envmostrará apenas as varaibles que foram marcadas para exportação. Compare a saída de env | sorte export -pe você verá o que quero dizer. Você pode executar comm -23 <(set -o posix; set) <(env|sort)se desejar ver quais variáveis ​​de ambiente não estão sendo exportadas.

O motivo da discrepância é que envé um executável separado, ao contrário do setqual é um comando interno do shell. De acordo com o manual do Bash, quando um comando é executado que não é um comando ou função interna do shell, ele recebe apenas variáveis ​​de ambiente que foram marcadas para exportação no Bash . Existem muitas variáveis ​​que não são exportadas. Portanto, se você deseja ver todas as variáveis ​​definidas pelo seu shell, use o setcomando conforme indicado no manual.

Você pode facilmente testar esse comportamento usando os seguintes comandos.

MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE

Você verá que setfornece saída enquanto envnão fornece .

Estrela do Mar
fonte
24

O envcomando sem argumentos imprimirá uma lista das variáveis ​​de ambiente "exportadas" e seus valores. Essas variáveis ​​são tornadas visíveis para os subprocessos - muitas outras variáveis ​​de ambiente não são mostradas com isso e usadas apenas dentro do shell em execução, por exemplo, para configuração.

RedGrittyBrick
fonte
10
Eu prefiro printenv, pois ambos enve settêm outras funções do que apenas gerar o ambiente.
Iglvzx
3
envimprimirá apenas uma lista de variáveis ​​de ambiente que foram marcadas para exportação. Não imprimirá todas as variáveis.
Starfish
4
@ Starfish está certo - isso significa que esta resposta aceita estava muito errada. Editado para dizer que está listando apenas variáveis ​​exportadas.
Volker Siegel