Por que esta declaração de origem não funciona?

Por que esta declaração de origem não funciona?

O arquivo tmp.shcontém:

func() {
   ls
}

Se o arquivo for originado usando source tmp.sh, a função funcfuncionará bem.

No entanto, se o sourcing for feito como cat tmp.sh | source /dev/stdinreclamações bash:

-bash: func3: comando não encontrado

Qual é a diferença entre os dois métodos de fornecimento? Do sourceponto de vista de não deve haver nenhuma diferença, pois /dev/stdintambém haveria um identificador de arquivo.

Responder1

Do bash(1):Cada comando em um pipeline é executado como um processo separado (ou seja, em um subshell).

O shell principal não tem acesso às definições de seus subshells.

informação relacionada