Não, quando você executa um script, seu shell cria um novo processo no qual o interpretador desse script é executado para interpretar o conteúdo desse script.
Qualquer atribuição de variável afetará apenas as variáveis do shell de essa invocação do shell no processo esse . Depois que esse processo morrer, as variáveis do shell de chamada não serão afetadas.
A única exceção que eu sei é com o fish
shell ao usar set -U var value
para definir fish
variáveis universais , onde fish
passa o valor da variável usando algum mecanismo IPC entre processos executando fish
e usam armazenamento permanente para reter o valor da variável quando nenhum processo fish
estiver sendo executado.
Agora, quando você gera um script (em oposição a executá-lo ) com o comando .
ou source
builtin dentro do seu shell, então diga > seu shell para interpretar o código nesse script (não há subprocesso envolvido aqui, . ./script.zsh
é semelhante a eval "$(<script.zsh)"
). Mas, em seguida, você geralmente usa apenas source
quando faz as atribuições de variáveis que afetam o seu shell, como quando arquivos de ambiente sourcing .
Agora você pode imaginar scripts criados para serem usados em algumas variáveis , funções , aliases ... a serem definidos em o shell de chamada, mas alguns que são apenas variáveis auxiliares que não são. E então sim, você poderia usar uma função anônima com escopo local como:
myfunc() echo hi # function meant to be defined for the invoker
myvar=value # same for a variable
(){ local i # i variable local
for i in foo bar
alias $i='echo x' # alias defined globally
done
}
(note que o zsh apenas implementa o escopo local para variáveis e opções, não para funções, aliases ...)