Exportar uma variável de dentro de uma função é igual à exportação global dessa variável?

3

Eu uso o Ubuntu 16.04 com o Bash nativo.

Não tenho certeza se estou executando

#!/bin/bash
myFunc() {
    export myVar="myVal"
}
myFunc

é igual em qualquer sentido, apenas executando export myVar="myVal" .

É claro que uma variável global deve ser declarada fora de uma função (uma questão de convenção, suponho, mesmo que tecnicamente possível), mas me pergunto sobre os casos mais exóticos em que alguém escreve alguma função geral e quer uma variável dentro dele ainda estar disponível para tudo, em qualquer lugar.

O export de uma variável dentro de uma função seria idêntico a exportá-la globalmente, diretamente na CLI, tornando-a disponível para tudo na shell (todas as subshells e funções dentro delas)?

    
por user9303970 13.02.2018 / 14:29

1 resposta

6

Seu script cria uma variável de ambiente, myVar , no ambiente do script. O script, como é apresentado atualmente, é funcionalmente exatamente equivalente a

#!/bin/bash

export myVar="myVal"

O fato de que export acontece no corpo da função não é relevante para o escopo da variável de ambiente (nesse 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 de 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 . ou source ). Nesse caso, todo o script estará sendo executado no ambiente do shell interativo (que é o propósito de "fazer o sourcing" de um arquivo shell).

Sem a chamada da função em si:

myFunc() {
    export myVar="myVal"
}

O fornecimento deste arquivo colocaria myFunc no ambiente do shell de chamada. Chamar a função criaria então a variável de ambiente.

Veja também a pergunta Quais escopos as variáveis de shell podem ter?

    
por 13.02.2018 / 15:35