O que mais pode quebrar se eu remover a exportação de uma variável?

5

Meu problema é que, quando comecei a codificar meu script, encontrei vários problemas de escopo de variáveis, o que resultou no mau hábito de exportar quase todas as minhas variáveis.

Agora que meu código ficou muito grande, eu estava pensando em limpá-lo e parte disso está removendo um monte de exportações inúteis. Infelizmente, não tenho certeza se meu conhecimento sobre o escopo da variável está completo. Mesmo depois de ler algumas páginas sobre o assunto.

O que eu sei (e espero que esteja certo):

1-A exportação de uma variável disponibiliza o conteúdo para sub-processos:

export myvar="content"

2-Coisas feitas entre parênteses como essa serão afetadas pela remoção das exportações (pelo que entendi, esta é a única maneira de declarar / usar um subshell):

$(grep "content" <<< $myvar)

3-Variáveis declaradas sem definir seu escopo são globais:

myvar="content"

4-Como não declaro nenhuma variável local, não preciso me preocupar em causar problemas em minhas funções:

local myvar="i don't use this"

Perguntas:

1 - Há algum ponto em prosseguir com a remoção das exportações inúteis ao lado do meu código sem exagerar no óbvio noobismo?

2- Se eu continuar com isso, há algo mais que eu deveria estar ciente que pode ser afetado e quebrar meu código? ou existe algum do meu conhecimento errado / incompleto?

3- Se você souber de uma referência de escopo variável bem escrita (e completa), compartilhe o link.

    
por TCZ8 17.06.2014 / 16:52

1 resposta

2

Você pode remover todas as exportações sem qualquer efeito nas variáveis exportadas, desde que você não use export para avaliar duas vezes. Por duas vezes avaliar quero dizer:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

Em vez disso, use:

set -a 

... no topo do script. Todas as variáveis definidas a partir de então serão automaticamente exported - o que incluiria variáveis que você talvez não tenha anteriormente export ed. Alternativamente, você poderia apenas set -a para uma parte do script e, posteriormente, set +a para desfazer a configuração - também poderia funcionar como função.

Mas os subshells herdam automaticamente os valores das variáveis, portanto:

var1=value
( echo "$(echo "$var1")" )
value

export não faz diferença nesse caso.

Mas se o script chamar outro script, ou qualquer outro executável que interprete valores que você tenha export ed e você deixar de export , esses valores não estarão mais disponíveis em seu ambiente. No exemplo a seguir, eu uso a variável de shell $PS1 - que define o conteúdo de um prompt do shell interativo - para demonstrar como as variações nas variáveis export ed afetam os processos filhos.

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit

Mas ...

PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

sh-4.3$ exit
exit

Mas, novamente, se você declarar explicitamente variáveis de ambiente ao invocar um processo ...

PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}

###OUTPUT###

this is another executable
 > exit
exit
sh-4.3$ exit
exit
    
por 18.06.2014 / 00:48