Variável de ambiente de desconexão com um nome vazio

3

Por algum motivo, meu sistema define uma variável de ambiente sem nome. Isso pode ser visto na saída de printenv como uma linha contendo apenas = e causa problemas para o Python (mais especificamente o os.environ object).

Como faço para desfazer essa variável de ambiente? Existe alguma outra solução alternativa (por exemplo, impedir que a variável seja definida em primeiro lugar)?

Para reproduzir, e. env -i printenv , ou para o problema do Python, env -i = python -c "import os; os.environ.clear()"

    
por Anders Lundstedt 11.01.2015 / 00:37

2 respostas

2

As variáveis de ambiente não devem ter um nome vazio, então muitos utilitários não as suportam.

O comando env do GNU coreutils suporta a configuração da variável de ambiente com um nome vazio, mas não a desabilitando. Isso é um bug.

$ env '=wibble' env |grep wibble                                 
=wibble
$ env '=wibble' env -u '' env
env: cannot unset '': Invalid argument

Os shells comuns também não podem desarmar o nome vazio. Tudo bem, já que o nome vazio não deve ser usado como uma variável de ambiente e não pode ser usado como uma variável de shell. Zsh é o único buggy no lote: ele finge fazer o trabalho, mas na verdade não faz nada.

$ env '=wibble' dash -c 'unset ""'
dash: 1: unset: : bad variable name
$ env '=wibble' bash -c 'unset ""'
bash: line 0: unset: '': not a valid identifier
$ env '=wibble' ksh -c 'unset ""'
ksh[1]: unset: : invalid variable name
$ env '=wibble' mksh -c 'unset ""'
mksh: : is read only
$ env '=wibble' posh -c 'unset ""'
posh: unset:  is read only
$ env '=wibble' zsh -c 'unset ""'
$ env '=wibble' zsh -c 'unset ""; env' | grep wibble
=wibble

Python, como você notou, corrige erros quando encontra o nome vazio de uma variável de ambiente .

Perl não tem esse problema, por isso pode ser uma solução para você. Observe que você precisa executar um novo shell para usar um processo externo para alterar o ambiente.

perl -e 'delete $ENV{""}; exec $ARGV[0] @ARGV' "$SHELL" "-$-"
    
por 12.01.2015 / 00:16
0

Você pode fazer:

import os
for k in os.environ.keys():
     print repr(k)
     del os.eniviron[k]
print os.environ
os.environ.clear()

Não sei por que um os.environ.clear() direto gera o erro. Eu iniciei o código de loop acima para ver se encontrei a chave que estava causando o problema. Por favor, não que você tenha que especificar .keys() , apenas iterar usando for k in os.environ: dará um erro porque você altera o dicionário sobre quais chaves você está iterando ( .keys() cria uma cópia).

    
por 11.01.2015 / 01:08