As funções são executadas como subprocessos no Bash?

25

No Guia avançado de script de script , em exemplo 27-4 , 7ª linha da parte inferior, li isto:

A function runs as a sub-process.

Eu fiz um teste no Bash, e parece que a afirmação acima está errada.

Pesquisas neste site, no Bash Man e no meu mecanismo de pesquisa não trazem nenhuma luz.

Você tem a resposta e gostaria de explicar?

    
por Tomasz 24.08.2016 / 01:00

3 respostas

34

O Guia avançado de script de script nem sempre é confiável e seus scripts de exemplo contêm práticas desatualizadas, como o uso de preteriu os backticks para substituição de comando, ou seja, 'command' em vez de $(command) .

Neste caso específico, é flagrantemente incorreto.

A seção sobre Funções da Shell no (canônico ) O manual de Bash afirma definitivamente que

Shell functions are executed in the current shell context; no new process is created to interpret them.

    
por 24.08.2016 / 01:08
27

As funções de chaves curtas serão executadas dentro do processo do shell de chamada, a menos que precisem de sua própria subshell, que é:

  • quando você os executa em segundo plano com &
  • quando você os executa como um link em um pipeline

Redirecionamentos ou env. variáveis não forçarão um novo subshell:

hw(){
    echo hello world from $BASHPID
    echo var=$var
} 
var=42 hw >&2
echo $BASHPID  #unexports var=42 and restores stdout here

Se você definir a função com parênteses em vez de curlies:

hw()(
  echo hello world from $BASHPID
)
hw 
echo $BASHPID

sempre será executado em um novo processo.

A substituição do comando $() também sempre cria processos no bash (mas não no ksh se você executa builtins dentro dele).

    
por 24.08.2016 / 01:22
8

O comando em questão daquele exemplo se parece com:

echo ${arrayZ[@]/%e/$(replacement)}

O exemplo mais adiante afirma:

#    $( ... ) is command substitution.
#    A function runs as a sub-process.

Sendo caridoso para o ABS Guide, o que aparentemente pretendiam escrever é que a função é executada dentro de uma substituição de comandos e o comando dentro de uma substituição de comandos é executado em um subshell .

    
por 24.08.2016 / 01:22