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

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

Em um terminal bash 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? Como?

Responder1

DR:usar(set -o posix ; set)


De acordo com o manual do Bash você podeuse o setcomando integrado para mostrar todas as variáveis ​​de ambienteque foram definidos. O setcomando 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 envcomando, porém este comando não fornecerá uma lista completa de variáveis ​​de ambiente. envmostrará apenas as variáveis ​​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 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 setcomando 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 setcomando 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 setfornece saída, mas envnão.

Responder2

O envcomando 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).
  • -zcondição: verifique se o valor é nulo, caso contrário imprima "variável = valor".

Nota: printenvtambém é ótimo, mas mostrará apenas uma lista de variáveis ​​de ambiente que foram exportadas, não variáveis ​​locais/bash.

informação relacionada