3

在接下来的会话中,bash 启动了两个不同的管道,但它们共享相同的 pgid。当ls管道被移除(因此不同的管道不会在子外壳中调用)时,两个管道将获得不同的进程组。是什么赋予了?特别是,非交互式外壳将不同的管道放在同一个进程组中是否正确?还是我误解了什么?

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

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

但是,当您从 管道传输时lsfor循环将在子shell 中执行。因为它不是交互式外壳,所以没有作业控制,所以没有必要将每个管道放在自己的进程组中。所以整个子shell只是一个进程组。

于 2013-09-19T01:16:01.163 回答