Meu problema é que quando comecei a codificar meu script encontrei vários problemas de escopo de variáveis que resultaram no mau hábito de exportar quase todas as minhas variáveis.
Agora que meu código ficou bem grande, eu estava pensando em limpá-lo e parte disso é remover um monte de exportações inúteis. Infelizmente, não tenho certeza se meu conhecimento sobre escopo variável está completo. Mesmo depois de ler algumas páginas sobre o assunto.
O que eu sei (e espero que esteja certo):
1-Exportar uma variável disponibiliza seu conteúdo para processos subshell:
export myvar="content"
2-Coisas feitas entre parênteses como esta 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-As variáveis declaradas sem definição de escopo são globais:
myvar="content"
4-Como não declaro nenhuma variável local, não preciso me preocupar em causar problemas nas minhas funções:
local myvar="i don't use this"
Questões:
1- Existe algum sentido em prosseguir com a remoção das exportações inúteis ao lado do meu código que não cheira a noobishness óbvio?
2- Se eu continuar, há mais alguma coisa que eu deva estar ciente que possa ser afetada e quebrar meu código? ou há algum conhecimento meu errado/incompleto?
3- Se você conhece uma referência de escopo de variável bem escrita (e completa), compartilhe o link.
Responder1
Você pode remover todas as exportações sem qualquer efeito nas variáveis exportadas, desde que não export
avalie duas vezes. Por avaliar duas vezes, quero dizer:
var1=var2
export "${var1}=var3"
echo "$var2"
var3
Em vez disso, basta usar:
set -a
...no topo do script. Todas as variáveis definidas posteriormente serão automaticamente exported
- o que incluiria variáveis que você talvez não tenha export
editado anteriormente. Alternativamente, você poderia apenas set -a
para uma parte do script e posteriormente set +a
desmarcá-lo - também poderia funcionar como função.
Mas os subshells herdam automaticamente os valores das variáveis de qualquer maneira, então:
var1=value
( echo "$(echo "$var1")" )
value
export
não faz diferença nesse caso.
Mas se o seu script chamar outro script ou qualquer outro executável que interprete os valores que você export
editou e você parar de export
usá-los, esses valores não estarão mais disponíveis em seu ambiente. No exemplo a seguir, uso a variável shell $PS1
- que define o conteúdo do prompt de um shell interativo - para demonstrar como as variações nas export
variáveis 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