嵌套命令组不会产生嵌套进程组吗?

嵌套命令组不会产生嵌套进程组吗?

我对 bash 有点陌生,并且已经连续使用它大约一个月了。

在尝试了解嵌套命令组的工作原理时,我尝试了以下命令:

((ps j; ps j); ps j; ps j)

现在,我所期望的是嵌套组将生成一个单独的进程组,并以新的 bash shell 作为组长。创建了一个新的 bash shell,但由于某种原因,嵌套的 bash shell 与其上面的 bash shell 位于同一进程组中。

为什么是这样?可能是因为我试图静态查看进程信息?

答案1

作为第一个猜测,我假设以( .. )不使用开头的子外壳作业控制,就像非交互式脚本不这样做一样。然而,$-似乎甚至在括号内也包含m用于作业控制(以及i用于交互):

$ echo $-
himuBs
$ bash -c 'echo $-'
hBc
$ ( echo $-; )
himuBs

但我认为这有点谎言,因为显式启用作业控制会使一些进程组出现。

这些都在一个 PG 中:

$  ( (ps j; ps j); ps j;) | awk 'NR == 1 || /[p]s/'
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
32524 32525 32522 32368 pts/23   32522 R+    1000   0:00 ps j
32524 32526 32522 32368 pts/23   32522 R+    1000   0:00 ps j
32522 32527 32522 32368 pts/23   32522 R+    1000   0:00 ps j

这些不是:

$ ( set -m; (ps j; ps j); ps j;) | awk 'NR == 1 || /[p]s/'
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
32518 32519 32518 32368 pts/23   32516 R     1000   0:00 ps j
32518 32520 32518 32368 pts/23   32516 R     1000   0:00 ps j
32516 32521 32521 32368 pts/23   32516 R     1000   0:00 ps j

相关内容