Existe alguma diferença entre configurar uma variável de ambiente para a string vazia e desativá-la?

4

Existe alguma diferença prática entre cancelar a configuração de uma variável de ambiente e defini-la como uma string vazia?

    
por Ryan Thompson 26.12.2011 / 22:51

2 respostas

4

Cada aplicativo é livre para interpretar uma variável não definida e uma variável vazia da mesma maneira ou não. Geralmente, é uma má ideia dar a eles diferentes significados, e a maioria dos aplicativos não faz isso, mas acontece.

Um exemplo em shells é a variável de shell IFS (que é geralmente não exportados no ambiente, mas o mesmo princípio se aplica). Se não definido, o shell se comporta como se o valor fosse $' \t\n' .

Em um script de shell, $foo se expande para uma sequência vazia, seja foo definido como vazio ou não definido. Você pode executar o shell na configuração nounset ( set -u ou set -o nounset ) , caso em que o shell reporta um erro e sai se você tentar expandir uma variável não definida. Caso contrário, você pode distinguir entre variáveis não definidas e vazias com os modificadores expansão de parâmetros : ${foo:+a} expande para a se foo não estiver definido ou vazio e para a sequência vazia, caso contrário, enquanto ${foo+a} expande para a mesmo se foo estiver definido para a cadeia vazia.

    
por 26.12.2011 / 23:36
0

Existe uma diferença, sim. Mas é muito sutil, pois avaliar uma string vazia e uma variável não definida são as mesmas.

$ env - FOO= sh -c 'echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XxX
FOO=
PWD=/tmp
$ env - FOO= sh -c 'unset FOO; echo "X${FOO}X X${FOO:+x}X X${FOO+x}X"; env'
XX XX XX
PWD=/tmp

Ambos terão ${FOO:+x} avaliado para uma string vazia. Mas ${FOO+x} irá avaliar um "x" quando FOO for uma string vazia.

Uma coisa que eu geralmente uso isso é configurar uma variável de ambiente $DEBUG e, em seguida, usar ${DEBUG+true} no programa. Então eu posso definir o DEBUG para qualquer coisa, incluindo uma string vazia.

Em linguagens de nível superior, como Perl e Python, esta é a diferença entre "" e undef (Perl) ou None (Python).

    
por 26.12.2011 / 23:12