bash中的进程组

Wil*_*ell 3 bash shell

在下面的会话中,bash启动两个不同的管道,但它们共享相同的pgid.当ls管道被删除(所以不同的管道没有在子shell调用),两个管道得到不同的处理组.是什么赋予了?特别是,非交互式shell将不同的管道放在同一个进程组中是否正确?还是我误解了什么?

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$ 
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 5

在第二个示例中,for循环在当前的交互式shell中执行,该shell启用了作业控制.作业控制要求每个作业都在其自己的进程组中.

但是当你从中进行管道传输时ls,for循环将在子shell中执行.因为它不是交互式shell,所以没有作业控制,因此不需要将每个管道放在它自己的进程组中.所以整个子shell只是一个进程组.