Eu uso o Ubuntu 16.04 com o Bash nativo nele.
Não tenho certeza se estou executando
#!/bin/bash
myFunc() {
export myVar="myVal"
}
myFunc
é igual em qualquer sentido, a apenas executar export myVar="myVal"
.
É claro que uma variável global geralmente deve ser declarada fora de uma função (uma questão de convenção, presumo, mesmo que seja tecnicamente possível), mas me pergunto sobre os casos mais exóticos em que alguém escreve uma função muito geral e deseja uma variável dentro dela para ainda estar disponível para tudo, em qualquer lugar.
Será que export
uma variável dentro de uma função seria idêntica a exportá-la globalmente, diretamente na CLI, disponibilizando-a para tudo no shell (todos os subshells e funções dentro deles)?
Seu script cria uma variável de ambiente,
myVar
, no ambiente do script. O script, como é apresentado atualmente, é funcionalmente exatamente equivalente aO fato de o
export
acontecer no corpo da função não é relevante para o escopo da variável de ambiente (neste caso). Ele começará a existir assim que a função for chamada.A variável estará disponível no ambiente do script e no ambiente de qualquer outro processo iniciado a partir do script após a chamada da função.
A variável não existirá no ambiente do processo pai (o shell interativo do qual você executa o script), a menos que o script seja originado (com
.
ousource
), caso em que todo o script será executado no ambiente do shell interativo (que é o propósito de "fornecer" um arquivo shell).Sem a própria chamada de função:
O fornecimento desse arquivo seria colocado
myFunc
no ambiente do shell de chamada. Chamar a função criaria a variável de ambiente.Veja também a questão Quais escopos as variáveis do shell podem ter?
Se estiver usando uma função que exporta uma variável, certifique-se de não chamá-la dentro de um subshell, por exemplo
Isso também acontecerá se canalizar a função, já que pipe usa subshell.
Por exemplo, tubulação em T:
Para evitar o subshell pipe, use o redirecionamento: