我对 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