首页 > 解决方案 > 执行 bash 命令组时 `ps --forest` 的解释是什么?

问题描述

根据 bash 手册(https://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html#Command-Grouping):

( list ) 在括号之间放置一个命令列表会导致创建一个子shell环境

{ 列表; 在大括号之间放置一个命令列表会导致该列表在当前 shell 上下文中执行。

现在,我对他们的样子感到困惑ps --forest

如果我运行( sleep 10 )or { sleep 10; },两者都显示为:

myuser   710405  0.0  0.0  14552  7484 pts/2    S    16:18   0:00  |   \_ bash
myuser   723783  0.0  0.0   8424   428 pts/2    S+   16:26   0:00  |       \_ sleep 10

似乎在这两种情况下都没有创建子进程。现在,当我在后台运行命令组时,行为会有所不同。(sleep 10) &仍然看起来:

myuser   710405  0.0  0.0  14552  7484 pts/2    S+   16:18   0:00  |   \_ bash
myuser   725828  0.0  0.0   8424   480 pts/2    S    16:27   0:00  |       \_ sleep 10

{ sleep 10; } &现在看起来:

myuser   710405  0.0  0.0  14552  7484 pts/2    S+   16:18   0:00  |   \_ bash
myuser   728247  0.0  0.0  14036  5140 pts/2    S    16:29   0:00  |       \_ bash
myuser   728248  0.0  0.0   8424   460 pts/2    S    16:29   0:00  |           \_ sleep 10

根据第一次(非背景)观察,似乎子壳不是作为(新)进程产生的。但是,为什么会{} &生成一个,特别是考虑到它不应该产生一个子shell(虽然() &应该)?

标签: bashbackground-processjobssubshell

解决方案


推荐阅读