Почему этот исходный оператор не работает?

Файл tmp.sh содержит:

 func() { ls } 

Если файл получен с использованием source tmp.sh , функция func работает нормально.

Однако, если поиск выполняется как cat tmp.sh | source /dev/stdin жалобы cat tmp.sh | source /dev/stdin bash:

-bash: func3: команда не найдена

В чем разница между двумя методами поиска? С точки зрения источника не должно быть никакой разницы, поскольку /dev/stdin также будет дескриптором файла.

Из bash (1): Каждая команда в конвейере выполняется как отдельный процесс (т. Е. В подоболочке).

Основная оболочка не имеет доступа к определениям своих подоболочек.