为什么带花括号的命令分组会导致生成两个bash shell?

为什么带花括号的命令分组会导致生成两个bash shell?,bash,shell,subshell,Bash,Shell,Subshell,考虑以下命令 $ bash -c " sleep 10000 | sed 's/ Something//g '" 该命令导致的进程树如下所示: \-+= 69771 hbaba -bash \-+= 39225 hbaba bash -c sleep 10000 | sed 's/ Something//g ' |--- 39226 hbaba sleep 10000 \--- 39227 hbaba sed s/ Something//g

考虑以下命令

$ bash -c "  sleep 10000  | sed 's/ Something//g '"
该命令导致的进程树如下所示:

   \-+= 69771 hbaba -bash
     \-+= 39225 hbaba bash -c   sleep 10000  | sed 's/ Something//g '
       |--- 39226 hbaba sleep 10000
       \--- 39227 hbaba sed s/ Something//g
使用花括号添加将显著更改流程树

$ bash -c " { sleep 10000; } | sed 's/ Something//g '"
bash进程派生了两次

 \-+= 69771 hbaba -bash
         \-+= 39323 hbaba bash -c  { sleep 10000; } | sed 's/ Something//g '
           |-+- 39324 hbaba bash -c  { sleep 10000; } | sed 's/ Something//g '
           | \--- 39326 hbaba sleep 10000
           \--- 39325 hbaba sed s/ Something//g
这种重复的原因是什么


关于花括号的文档提到了以下内容:

将命令列表放置在大括号之间会导致该列表 在当前shell上下文中执行。没有创建子shell

在我看来,我所看到的与当前的shell上下文不同。不应创建新的子shell。我们没有使用括号


我知道bash在自己的子shell中的管道中生成每个进程

从:

管道中的每个命令都在其自己的子shell中执行

我不是问为什么
睡眠
sed
是两个不同的过程。我问的是两次重击:39323和39324


我正在使用这个bash版本

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)

更新

我在Unix和Linux中发现了这一点。我想这就是答案。不过,仍有一些未澄清的方面。在那个问题上,花括号是嵌套的。此外,这表明额外的子shell创建是使用管道进行的,而不是使用分号分隔的命令

实际上,该命令不会创建额外的子shell

bash -c " { sleep 10000; } ; sed 's/ Something//g '"
这是流程树。我猜管道命令的并行执行在这个额外的子shell创建中也起到了作用

bash,100648
  └─bash,104674 -c  { sleep 10000; } ; sed 's/ Something//g '
      └─sleep,104675 10000

我没有一个明确的答案给你,但是在
列表下的
man bash
第4段中大约看10行,“由
分隔的命令按顺序执行;
;shell依次等待每个命令终止。返回状态是最后执行的命令的退出状态。”。唯一突出的是,由于
“;”的原因,似乎需要额外的过程来跟踪命令的顺序执行在大括号内,而不是大括号本身。我需要看得更远,但我想我会把它传下去。4.4版也是如此。12@DavidC.Rankin你是说
之后的
睡眠10000
对此负责吗?我会对此感到非常惊讶。我认为这是一个语法要求。没有它,bash打印
bash:-c:第1行:语法错误:意外的文件结尾。以下两个都有相同的进程树:
bash-c“sleep 10000;”
bash-c“sleep 10000”
。带和不带最后分号。如果分号是我问题中示例中的原因,您是否也希望在这种情况下有所不同?我不确定结尾
;”是否有任何影响。我怀疑,但没有看过代码,当最后一个
';'后,只需检查是否还有其他内容,如果没有,则会自动放弃。我没有确定的答案,但请在
列表下的
man bash
第4段中查看大约10行,用
分隔的命令按顺序执行;shell依次等待每个命令终止。返回状态是最后执行的命令的退出状态。“。唯一突出的是,由于
”,似乎需要额外的过程来跟踪命令的顺序执行;”在大括号内,而不是大括号本身。我需要看得更远,但我想我会把它传下去。4.4版也是如此。12@DavidC.Rankin你是说
之后的
睡眠10000
对此负责吗?我会对此感到非常惊讶。我认为这是一个语法要求。没有它,bash打印
bash:-c:第1行:语法错误:意外的文件结尾。以下两个都有相同的进程树:
bash-c“sleep 10000;”
bash-c“sleep 10000”
。带和不带最后分号。如果分号是我问题中示例中的原因,您是否也希望在这种情况下有所不同?我不确定结尾
;”是否有任何影响。我怀疑,但没有看过代码,当最后一个
';'时,所发生的只是检查是否还有其他内容,如果没有,则会自动放弃。