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