Em um terminal bash do Linux, muitas vezes há muitas variáveis de ambiente que foram definidas, como $PATH
e $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 $PATH
e $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 set
comando interno para mostrar todas as variáveis de ambiente que foram definidas. O set
comando 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 env
comando, no entanto, este comando não fornecerá uma lista completa das variáveis de ambiente. env
mostrará apenas as varaibles que foram marcadas para exportação. Compare a saída de env | sort
e export -p
e 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 set
qual é 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 set
comando 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 set
fornece saída enquanto env
não fornece .
O env
comando 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 env
e set
têm outras funções do que apenas gerar o ambiente.
env
imprimirá 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!