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

13

Com a família de shell Bourne, todas as variáveis ​​de shell têm nomes em 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 olhando seu nome. Como você determina quais variáveis ​​de shell Bourne são locais (definidas apenas dentro do shell atual)?

Shoulderpadz
fonte
4
Casca Bourne ou Casca Bourne-novamente? Você pode apontar para uma referência para a variável variável em maiúsculas?
Jeff Schaller
No shell Bourne-again, como todas as variáveis ​​são maiúsculas, como você pode determinar quais variáveis ​​bash são locais?
Shoulderpadz
7
@Shoulderpadz nada impede que você crie variáveis ​​em minúsculas.
muru 7/09/17
1
Por local , você quer dizer variáveis ​​que não foram exportadas?
Eliah Kagan
4
A distinção que você está perguntando é sobre variáveis ​​de shell versus variáveis ​​de ambiente, não global versus local. Observe que existem variáveis ​​de shell que não são variáveis ​​de ambiente (ou seja, o que você está chamando de "local") e existem variáveis ​​de ambiente que não são variáveis ​​de shell (o ambiente pode conter nomes que não são identificadores de shell válidos e, portanto, não podem ser variáveis).
chepner

Respostas:

17

Se você deseja 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"
muru
fonte
26

A maneira mais portátil é export -p.

export -plista variáveis ​​exportadas. Geralmente é assim declare -x, se o seu shell tiver declare.

As conchas no estilo Bourne atualmente em uso devem suportar export -p, conforme exigido pelo POSIX :

Quando -p for especificado, a exportação gravará na saída padrão os nomes e valores de todas as variáveis ​​exportadas, no seguinte formato:

"export %s=%s\n", <name>, <value>

se o nome estiver definido e:

"export %s\n", <name>

se o nome não estiver definido.

O padrão continua explicando que o valor da variável é exibido de tal maneira que geralmente permite que seja usado posteriormente no lado direito de =uma atribuição. Isso quer dizer que pode ser citado. Cascas diferentes podem exibi-las de maneira diferente, mas com o mesmo efeito. export -pfunciona mesmo em conchas que não têm declareembutido, como o 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 canalizei a saída para grepobter compacidade, mas se você não a filtrar, obterá a lista completa de suas variáveis ​​exportadas. Da 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 seja explicitamente instruído a se comportar de maneira compatível com POSIX. No Bash export -pfornece a mesma saída que declare -xpor 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"

O 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) pesquisando uma palavra seguida por =. Isso não depende das palavras anteriores da linha, desde que elas não precedam imediatamente =, o que não deveriam. Por exemplo:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

Observe que nem todas as entradas necessariamente possuem =. Isso ocorre porque as variáveis ​​podem ser desmarcadas, mas exportadas. Essas entradas são filtradas pelo grepcomando acima, que pode ou não ser o que você deseja.

Na maioria das vezes, você só quer inspecionar a saída e assim você não vai se importar se as entradas são precedidas por export, declare -x, typeset -xou outra coisa. Então apenas corra export -p.

Testei esses comandos no Ubuntu 16.04 LTS com versões oficialmente empacotadas de cada shell.

Eliah Kagan
fonte
0

Variáveis ​​que NÃO são exportadas podem ser vistas na saída do declarecomando no bash.

Variáveis que são exportados pode ser visto de saída do declare -xou exportcomando no bash.

S471
fonte