As funções bash são executadas no shell ou subshell atual?

3

Eu tenho um terminal aberto e chamo uma função bash:

change_path

onde:

change_path(){
 export PATH="foobar:$PATH";
}

change_path será sempre executado no shell atual e sempre mudará o $ PATH do shell atual? Até agora, nos meus testes, este parece ser o caso, mas é difícil dizer com certeza.

    
por Alexander Mills 02.05.2018 / 06:39

1 resposta

4

Sim, a função que você está chamando está executando no shell atual.
Isso está assumindo que a função foi importada (definida) no shell atual. Isso poderia ter sido feito por meio do fornecimento de algum arquivo (como ~ / .bashrc) ou pela gravação manual da função no shell atual. Você pode confirmar essa suposição executando:

$ type -a change_path

Se isso imprimir a definição da função, a função foi definida no presente shell e, tendo acesso às variáveis atuais do shell, poderia modificar qualquer uma delas.

Isso não significa que a função irá sempre modificar as variáveis se a função estiver adequadamente limitada, como usar (...) em vez de {...} :

$ change_path()(
    export PATH="foobar:$PATH";
)

Mas essa função ainda está em execução no shell atual, apenas que inicia um sub-shell (...)

Para confirmar, leia isto no manual do bash (ênfase minha):

FUNCTIONS
A shell function, defined as described above under SHELL GRAMMAR, stores a series of commands for later execution. When the name of a shell function is used as a simple command name, the list of commands associated with that function name is executed. Functions are executed in the context of the current shell; no new process is created to interpret them (contrast this with the execution of a shell script).

    
por 02.05.2018 / 07:06