
Em um terminal bash 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? Como?
Responder1
DR:usar(set -o posix ; set)
De acordo com o manual do Bash você podeuse o set
comando integrado para mostrar todas as variáveis de ambienteque foram definidos. O set
comando também exibirá as definições de quaisquer funções. Se você deseja ver apenas as variáveis, e não as funções, você pode ativar o modo POSIX antes de executar o comando set. A maneira mais fácil de fazer isso é com set -o posix
, mas isso deixará o modo POSIX ativado até você desligá-lo com set +o posix
.
Portanto, o comando a seguir mostrará todas as variáveis de ambiente definidas usando um subshell sem afetar a conformidade com POSIX em seu shell atual.
(set -o posix ; set)
@RedGrittyBrick e @iglvzx sugeriram usar o env
comando, porém este comando não fornecerá uma lista completa de variáveis de ambiente. env
mostrará apenas as variáveis 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 quiser ver quais variáveis de ambiente não estão sendo exportadas.
A razão para a discrepância é que env
é um executável separado, em oposição ao set
comando interno do shell. De acordo com o manual do Bash,quando um comando que não é um comando ou função interna do shell é executado, ele receberá 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 que seu shell definiu, você deve utilizar o set
comando conforme indicado no manual.
Você pode testar facilmente esse comportamento usando os comandos a seguir.
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, mas env
não.
Responder2
O env
comando sem argumentos imprimirá uma lista das variáveis de ambiente "exportadas" e seus valores. Essas variáveis ficam visíveis para os subprocessos - muitas outras variáveis de ambiente não são mostradas com isso e são usadas apenas dentro do shell em execução, por exemplo, para configuração.
Responder3
compgen -v
imprime variáveis do shell (mas não os valores).
compgen -e
imprime variáveis exportadas, ou seja, aquelas que são herdadas pelos processos que este 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
Responder4
Combinando algumas das respostas anteriores, considero o seguinte útil:
compgen -v | sort | while read var; do [ -z "${!var}" ] || echo $var=${!var} ; done
compgen -v
: Imprime todos os nomes de variáveis, locais ou exportadas.sort
: Ordem alfabética.${!var}
: Obtenha o valor de $var (variável indireta).-z
condição: verifique se o valor é nulo, caso contrário imprima "variável = valor".
Nota:
printenv
também é ótimo, mas mostrará apenas uma lista de variáveis de ambiente que foram exportadas, não variáveis locais/bash.