このソースステートメントが機能しないのはなぜですか?

このソースステートメントが機能しないのはなぜですか?

ファイルtmp.shには次の内容が含まれます。

func() {
   ls
}

ファイルが を使用してソース化されている場合source tmp.sh、関数はfunc正常に動作します。

ただし、ソースがcat tmp.sh | source /dev/stdinbash の苦情として行われた場合:

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

2 つのソース方法の違いは何ですか? の観点からは、もファイル ハンドルであるsourceため、違いはありません。/dev/stdin

答え1

bash(1)より:パイプライン内の各コマンドは、個別のプロセスとして(つまり、サブシェル内で)実行されます。

メイン シェルはサブシェルの定義にアクセスできません。

関連情報