A maneira mais defensiva / robusta de descompactar uma variável de ambiente dentro de um script de shell

0

Qual é a maneira mais defensiva / robusta / portátil / paranóica de desfazer uma variável de ambiente em um script?

Estou tentando evitar o uso de uma ferramenta externa para limpar variáveis de ambiente, como em env -i some-command ou perl -e 'delete $ENV{SOME_VARIABLE}; exec("some-command")' , se puder evitá-lo.

A partir de agora, estou usando

export SOME_VARIABLE; unset -v SOME_VARIABLE

que, acredito, remove SOME_VARIABLE mesmo se houver uma variável shell ou função shell com o mesmo nome. (embora ele destrua a variável shell, se existir).

    
por Gregory Nisbet 06.09.2017 / 02:07

1 resposta

4

unset SOME_VARIABLE remove SOME_VARIABLE do ambiente. Isso é tudo que você precisa em quase todos os casos. No raro caso em que isso não é bom o suficiente, você não pode escapar de chamar um processo intermediário (mas pode ser outra instância de sh ).

Chamar export e, em seguida, unset -v não tem nenhuma vantagem. É inútil exportar a variável se você for desmarcá-la depois. As funções não são armazenadas no ambiente, portanto, unset -v não afeta o que os subprocessos verão.

Alguns shells exportam funções pelo ambiente, mas o fazem codificando a definição da função como uma definição de variável. Se a variável tiver o mesmo nome que a função, unset FUNCTION_NAME cuidará dela e, se não, então unset -v FUNCTION_NAME não fará nada além do que unset FUNCTION_NAME faz.

Um caso de borda em que você não pode desanunar uma variável é se ela foi declarada como somente leitura. Não há uma maneira portátil de transformar uma variável de somente leitura em normal. Para remover uma variável somente leitura do ambiente portável, você precisa invocar outra cópia do shell:

readonly foo=bar
export foo
sh -c 'unset foo; exec some-command'

Outro caso de borda são algumas variáveis que algumas conchas insistem em definir e evitar que sejam silenciadas. Para removê-los do ambiente, você precisa usar outro shell ou um utilitário como env como ponto de partida.

    
por 07.09.2017 / 02:03