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?
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?
Respostas:
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 .
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.
printenv, pois ambos enve settêm outras funções do que apenas gerar o ambiente.
envimprimirá apenas uma lista de variáveis de ambiente que foram marcadas para exportação. Não imprimirá todas as variáveis.
compgen -v
imprime variáveis de shell (mas não os valores).
compgen -e
imprime variáveis exportadas, ou seja, aquelas que são herdadas pelos processos que esse shell inicia (mas não seus valores).
Diferença entre shell e variáveis exportadas: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
compgen -eé exatamente o que eu queria!