No Advanced Bash-Scripting Guide , no exemplo 27-4 , 7ª linha da parte inferior, li o seguinte:
Uma função é executada como um subprocesso.
Fiz um teste no Bash e parece que a declaração acima está errada.
As pesquisas neste site, Bash Man e meu mecanismo de pesquisa não trazem nenhuma luz.
Você tem a resposta e gostaria de explicar?
Respostas:
O Advanced Bash-Scripting Guide nem sempre é confiável e seus scripts de exemplo contêm práticas desatualizadas, como o uso de backticks efetivamente preteridos para substituição de comandos, ou seja, em
`command`
vez de$(command)
.Nesse caso em particular, é flagrantemente incorreto.
A seção Funções do Shell no manual Bash (canônico) afirma definitivamente que
fonte
As funções de chaves curvadas serão executadas dentro do processo do shell de chamada, a menos que precisem de seu próprio subshell, que é:
&
Redirecionamentos ou env extra. variáveis não forçam um novo subshell:
Se você definir a função entre parênteses, em vez de curvas:
sempre será executado em um novo processo.
A substituição de comandos
$()
também sempre cria processos no bash (mas não no ksh se você executar os componentes internos dentro dele).fonte
f() (...)
é permitido. Existem outras definições além de{...}
e(...)
? No Bash, ainda não gosto de outras pessoas.function hw { echo hello world; }
sintaxe (sem necessidade de()
se digitarfunction
e você pode especificar redirecionamentos logo após a final}
ou)
como nohw(){ echo error; } >&2
que é sobre ele..f()(...)
sempre execute um próprio shell, enquantof(){...}
não.foo() [[ x = x ]]
como uma definição de função válida também. No entanto, se você olhar para a função,type foo
verá que ainda é um açúcar sintáticofoo() { [[ x = x ]]; }
. O mesmo vale para as funções do subshell:bar() ( : )
torna - sebar() { ( : ); }
.O comando em questão desse exemplo se parece com:
O exemplo posterior afirma:
Sendo caridoso com o ABS Guide, o que eles aparentemente pretendiam escrever é que a função é executada dentro de uma substituição de comando e o comando dentro de uma substituição de comando é executado em uma subshell .
fonte