bashで実行されるプログラムは新しいタスクで実行されますか?

bashで実行されるプログラムは新しいタスクで実行されますか?

存在するこの動画、それは言う:

通常の状況で端末を開き、内部で実行されているシェルがある場合、そのシェルは新しいセッションの開始を示します。セッションはシェルプロセスを含むジョブから始まります。シェルがフォアグラウンドでパイプを実行すると、パイプのプロセスは既存のジョブのプロセスとして実行されます。

そして有名な場所ではTTY公開、シェルがフォアグラウンドでパイプラインを実行すると、新しいタスクの一部であるように見えます。何が正しいですか?

ここに画像の説明を入力してください。

答え1

「プログラム」が何を意味するかによって異なります。

まず、抜粋した映像の内容は誤解を招くことがあります。会議は次のように始まりました。働く、シェルプロセスを含みます。「で説明したように、タスクとプロセスの違いは何ですか?そしてPOSIX ジョブ定義、ㅏ働く シェルのコンセプトです。したがって、実行中のシェルは、以下で作成されない限り、ジョブ自体ではありません。親シェルプロセス。抜粋では、親プロセスは次のとおりです。端末その中では、で説明したようにバッシュガイドは必ずしもシェルである必要はないテキストベースのインタフェースプログラムを実行するためのグラフィカルインタフェースプログラムだけです。

以下は、テーブルを説明するいくつかのコマンドです。TTY公開正しい:

$ cat
hello
hello
^Z
[1]+  Stopped                 cat
$ cat | sort
^Z
$ jobs
[1]-  Stopped                 cat
[2]+  Stopped                 cat | sort

cat最終出力には2つの作業(および)があることを確認できます。cat | sort後者はls | sortテーブルに対応します。

「bashで実行されるプログラムが新しいジョブで実行されるかどうか」については、POSIX定義:

働く

同じプロセスグループ内のシェルパイプと、ここから派生したすべてのプロセスを含むプロセスグループ。

したがって、「シェルパイプを含むプロセスのセット」を実行しているプログラム(プログラムが実行されるコマンドのセットであることがわかります)と見なす場合はそうです。

しかし、「プログラム」は「シェルパイプ」よりも一般的な概念であるため、bashで実行されるプログラムは通常、新しいジョブでは実行されません。たとえばcatsortプログラムもプログラムですが、それぞれ別々のジョブで実行されるわけではありません。

返品、シェル組み込み関数「コマンドセット」なので「プログラム」です。ただし、これらはシェルプログラム自体に含まれているコンポーネントなので、実行のために必ずしも別のサブプロセスとして作成する必要はありません。別のサブプロセスで実行されないと、シェル操作の一部にすることはできません。

答え2

はい、そうです。後に ^Z と入力してシェルから生成することができ、bg独自の PID で実行され続けます。

関連情報