Propósito da exportação de função no bash

1

Se dermos uma olhada no seguinte exemplo:

# testing(){ echo hello;}
# testing
hello
# echo $(testing)
hello
# echo testing >script
# ./script
./script: line 1: testing: command not found
# source ./script
hello
# export -f testing
# ./script
hello

Acontece que uma função bash precisa ser exportada apenas se você quiser usá-la em um script não originário. Eu tentei vários níveis de subshells, o comportamento é o mesmo. Alguém pode confirmar isso, porque eu acho contraditório com a afirmação de que variáveis locais não existem em subcasas.

    
por Ulrik 10.05.2016 / 01:33

2 respostas

1

source ./script não cria um subshell. O script é executado no shell atual. Nada de inesperado aqui.

No entanto, uma substituição de comando como em echo $(testing) faz criar uma sub-rede. Se eu te entendi direito, você está surpreso que funciona.

Isso é explicado em Manual de Referência do Bash, seção Ambiente de Execução de Comando [ênfase minha]:

Command substitution, commands grouped with parentheses, and asynchronous commands are invoked in a subshell environment that is a duplicate of the shell environment, except that traps caught by the shell are reset to the values that the shell inherited from its parent at invocation.

Portanto, é uma exceção documentada à afirmação de que as variáveis locais não existem em subshells.

    
por 29.04.2017 / 20:25
-1

As funções tornam-se parte do ambiente do processo, exportando-as, assim como as variáveis. Então, para herdá-los para subprocessos como um script chamado, eles devem ser exportados. Até que não seja exportado, faz parte apenas das variáveis do shell.

Nota: você pode listar o ambiente atual com o comando env builtin e listar as variáveis com set .

Nota 2: o comando source não cria uma subshell (subprocesso), como outros também indicam, então o source script funciona como você mostra no exemplo. Mas o comando ./script cria a subshell, então você precisa exportar a função.

    
por 29.04.2017 / 18:15