3

次のセッションでは、bash は 2 つの異なるパイプラインを開始しますが、同じ pgid を共有しています。パイプラインが削除されると (サブシェルで個別のlsパイプラインが呼び出されないように)、2 つのパイプは個別のプロセス グループを取得します。何を与える?特に、非対話型シェルが異なるパイプラインを同じプロセス グループに配置するのは正しい動作ですか? それとも私は何かを誤解していますか?

bash-3.2$ cat print-pgid 
#!/bin/sh
echo $$ starting in $(ps -o pgid= $$) >&2
bash-3.2$ ls | for i in a b; do ./print-pgid | ./print-pgid & done
bash-3.2$ 67396 starting in 67393
67395 starting in 67393
67397 starting in 67393
67398 starting in 67393

bash-3.2$ for i in a b; do ./print-pgid | ./print-pgid & done
[1] 67404
[2] 67406
bash-3.2$ 67404 starting in 67403
67403 starting in 67403
67405 starting in 67405
67406 starting in 67405

[1]-  Done                    ./print-pgid | ./print-pgid
[2]+  Done                    ./print-pgid | ./print-pgid
bash-3.2$ 
4

1 に答える 1

5

2 番目の例では、forジョブ制御が有効になっている現在の対話型シェルでループが実行されます。ジョブ制御では、各ジョブが独自のプロセス グループにある必要があります。

しかし、からパイプするlsと、forループはサブシェルで実行されます。これはインタラクティブなシェルではないため、ジョブ コントロールがなく、各パイプラインを独自のプロセス グループに配置する必要はありません。そのため、サブシェル全体が単一のプロセス グループにすぎません。

于 2013-09-19T01:16:01.163 に答える