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

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

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 exportavalie 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 exporteditado anteriormente. Alternativamente, você poderia apenas set -apara uma parte do script e posteriormente set +adesmarcá-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

exportnã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ê exporteditou e você parar de exportusá-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 exportvariá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

informação relacionada