请教一个传说中的sub-shell问题

请教一个传说中的sub-shell问题

和所有人一样, 我也听说了
“管道是在子shell中运行”
"{}"是在当前shell中运行
"()"是在子shell中运行

但今天遇到一个小问题, 再好好测试了一下, 越发不明白
复制内容到剪贴板
代码:
[root@andLinux ~]# echo $BASH_SUBSHELL | { cat; echo $BASH_SUBSHELL ; }
0
1
[root@andLinux ~]# { echo $BASH_SUBSHELL; } | { cat; echo $BASH_SUBSHELL ; }
1
1
[root@andLinux ~]# ( echo $BASH_SUBSHELL; ) | { cat; echo $BASH_SUBSHELL ; }
1
1
第一个例子似乎是说明了“只有管道后边的命令是在子shell中
可第二, 第三个怎么解释呢 ?      
{ command.. } 係 group command , 可能當一個
复制内容到剪贴板
代码:
fang@bash ~
$ help {
{ ... }: { COMMANDS ; }
    Run a set of commands in a group.  This is one way to redirect an
    entire set of commands.
      
journalist
如果是一个命令是一整个组, 那和单个命令应该是一样
这样才符合常理吧      
在学shell,查到的这个例子,练练
我想大概是这个样子的:
复制内容到剪贴板
代码:
( echo $BASH_SUBSHELL; ) | { cat; echo $BASH_SUBSHELL ; }
上面的执行顺序因应该是从我到右的基本吧,那么
左边的由于在小括号里,要开一个子进程,故它显示的值为1,即有一级的子进程
复制内容到剪贴板
代码:
( echo $BASH_SUBSHELL; )
然后到了通道,当然要再开一个子进程了
复制内容到剪贴板
代码:
|
但它和前面的
复制内容到剪贴板
代码:
( echo $BASH_SUBSHELL; )
在一个级里,
接着往下看,这是一个命令组
复制内容到剪贴板
代码:
{ cat; echo $BASH_SUBSHELL ; }
依次执行不再开进子进程了吧,那么其中的BASH_SUBSHELL应该也是1吧!
不知道解释的对不对,错的,说说啊,不甚感谢的我会!

      
还是觉得奇怪啊。
复制内容到剪贴板
代码:
[savage@tibohc ~]$ { echo $BASH_SUBSHELL;}
0
复制内容到剪贴板
代码:
[savage@tibohc ~]$ { echo $BASH_SUBSHELL;} | cat
1
第二个的输出为什么不是0呢?cat的输出应该是前面的值吧      
等那天闲了看看 bash 的 code 就清楚了 好在这些细节一般不影响我们平时的使用