在下面的会话中,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)
在第二个示例中,for
循环在当前的交互式shell中执行,该shell启用了作业控制.作业控制要求每个作业都在其自己的进程组中.
但是当你从中进行管道传输时ls
,for
循环将在子shell中执行.因为它不是交互式shell,所以没有作业控制,因此不需要将每个管道放在它自己的进程组中.所以整个子shell只是一个进程组.
归档时间: |
|
查看次数: |
2276 次 |
最近记录: |