Se você quiser ver se uma variável é exportada ou não, use declare
:
$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"
Com a família de shell Bourne, todas as variáveis do shell têm nomes de maiúsculas; o que significa que você não pode dizer se uma variável específica é uma variável de ambiente ou não apenas observando seu nome. Como você determina quais variáveis do shell Bourne são locais (definidas apenas no shell atual)?
export -p
. export -p
lista as variáveis exportadas. Isso geralmente é como declare -x
, se seu shell tiver declare
.
Cascas estilo Bourne atualmente em uso devem suportar export -p
, como é exigido pelo POSIX :
When -p is specified, export shall write to the standard output the names and values of all exported variables, in the following format:
"export %s=%s\n", <name>, <value>
if name is set, and:
"export %s\n", <name>
if name is unset.
O padrão prossegue para explicar que o valor da variável é exibido em de tal forma que normalmente permite que ele seja usado mais tarde no lado direito de =
em uma atribuição. Isto é para dizer que pode ser citado. Diferentes camadas podem exibi-las de maneira diferente, mas com o mesmo efeito. export -p
funciona mesmo em shells que não possuem declare
builtin, como Dash .
$ dash -c 'export -p | grep HOME=' # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME=' # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek
Eu canalizo a saída para grep
para compacidade, mas se você não filtrar, você verá a lista completa de suas variáveis exportadas. De sua pergunta, parece que é o que você pode achar mais útil.
Alguns shells, como o Bash, usam um formato não-padrão, a menos que explicitamente instruído a se comportar de uma maneira compatível com POSIX. No Bash export -p
fornece a mesma saída que declare -x
por padrão.
$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME=' # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"
Zsh mostra um formato não padrão mesmo quando a compatibilidade POSIX está ativada:
$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
Em qualquer caso, você pode extrair representações portáteis (que podem ser citadas) procurando por uma palavra seguida por =
. Isso não depende de palavras anteriores na linha, desde que elas não precedam imediatamente =
, o que elas não deveriam. Por exemplo:
% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....
Note que não todas as entradas têm necessariamente =
. Isso ocorre porque as variáveis podem ser indefinidas, mas exportadas. Essas entradas são filtradas pelo comando grep
acima, que pode ou não ser o que você deseja.
Na maioria das vezes, você só quer inspecionar a saída e não se importa se as entradas forem precedidas por export
, declare -x
, typeset -x
ou outra coisa. Em seguida, basta executar export -p
.
Eu testei esses comandos no Ubuntu 16.04 LTS com versões oficialmente empacotadas de cada shell.