盗梦终端 bash的嵌套

今天正好看到了TualatriX在去年写的《盗梦终端:如何进入第1000层梦境》,很有意思。程序猿说,盗梦空间就像是一层层的“函数调用”:Inception:一场层层调用的函数大战

而Shell有个内置的环境变量$SHLVL,可以用echo %SHLVL%显示当前Shell的级别Level或者说递归层次,你可以想象成Inception里的第n层梦境。在使用Shell(Bash为例)的过程中,实际上就是一个Inception的过程:

执行一个脚本的时候,并不是在当前的Shell环境下执行的,而是父进程shell fork()出一个“相同”的子进程,再调用exec()重新装载,执行具体命令,执行完毕后,销毁它,并回到当前的Shell。

一般情况下,我们的Shell都是第一层,如何进入下一层?只需要不停地执行自身(bash)即可,如果理解递归的话-3-

Shell最多支持几层梦境呢?Bash的源代码variables.c里搜索adjust_shell_level,可以找到

if (shell_level < 0)
shell_level = 0;
else if (shell_level > 1000){
internal_warning (_("shell level (%d) too high, resetting to 1"), shell_level);
shell_level = 1;
}

也就是说最多可以有1000层,超过1000层后,又回到第1层,也就是现实世界了?其实是不一样的,最多1000层什么是伪的,因为1001层(显示1)两次exit后重新显示999了- -! 回到第1层还是要一层层返回上去的吧…