このソース宣言が機能しないのはなぜですか?

このソース宣言が機能しないのはなぜですか?

このファイルtmp.shには以下が含まれます。

func() {
   ls
}

source tmp.shこの機能はfunc

ただし、購入がcat tmp.sh | source /dev/stdinbashの苦情で行われた場合:

-bash: func3: コマンドが見つかりません。

これら2つの購入方法の違いは何ですか?source視点では/dev/stdinファイルハンドルでもあるため、違いがあってはなりません。

答え1

Bash(1)から:パイプラインの各コマンドは、別々のプロセス(つまりサブシェルで)で実行されます。

デフォルトシェルはそのサブシェルの定義にアクセスできません。

関連情報