Como você determina se as variáveis do shell são exportadas ou não?

11

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)?

    
por Shoulderpadz 07.09.2017 / 03:44

2 respostas

17

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"
    
por 07.09.2017 / 04:51
24

A maneira mais portátil é 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.

    
por 07.09.2017 / 08:33

Tags