先明确一个观点,我们一直说的子shell,实际上是subshell和child shell的集合体,看书的时候可能会有疑惑,为什么书上写bash命令进入子shell,但在其中echo $BASH_SUBSHLL 结果为0,翻译的锅背定了好吧
简单理解,child shell是生成一个shell,继承全局变量(如bash 命令,所以非登录非交互shell可以不需要启动文件,因为所有全局变量已经继承好了)
而subshell就是fork,继承所有变量,故算入shell的嵌套深度(所以你可以在命令列表里写上你的局部变量)
我在查阅的过程中,经常看到有人说./xxx是生成子shell,这里是child shell(插一句,source就是直接拿命令在当前shell跑)
比较常见的生成subshell(需要注意的是subshell的io依旧与终端相连)的方法是命令替换、命令列表、管道
Shell(至少是Bash)会将管道运算符的前后命令放到subshell里执行。这将导致:看似在一个脚本的变量,出现改动后没效果的现象
来源:https://zhuanlan.zhihu.com/p/80350390
若想进行测试可参考如下网址
http://mywiki.wooledge.org/SubShell