盗梦终端 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层还是要一层层返回上去的吧…

递归和Droste Effect

递归
公认的递归(Recursion)的标准定义是非常难理解的:若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。通俗地说,递归就是大鱼吃小鱼,就是一条蛇咬住自己的尾巴,一样东西自己包含了自己。

Google就有一个很形象的彩蛋:在Google.com里搜索recursion,下面的纠错会很可爱地提示”Did you mean: recursion”,然后就可以陷入永无止境勒。因此递归通常是可以无限循环下去的,然后就有这样一个很Geek的笑话:

作为一个狂热的电脑游戏迷,如果有一天你从一个完全陌生的地方醒来,你如何判断这是虚拟空间还是在现实中? 答案是,找两面镜子来,互相对着放。如果出现周围的物体运动变慢等不正常的情况,说明你是在虚拟空间中。大自然是神奇的,它能处理两面镜子相对放置时镜子里应该显示的内容;但电脑就模拟不出来,如果电脑真遇到这种情况,指定会把CPU累死。

递归是种很重要的思想,从递归出发可以联系到化归,递推,分治,回溯,DP,分形…这里就不展开了,具体的可以去膜拜Matrix67的语文暑假作业某说明文:递归(?!)…ms那时候Matrix67就很实力进中文系了
PS: Matrix67.com的递归tags下还有很多强文,超有意思Orz

Droste effect
理解了递归,就可以明白Droste Effect就是种图片的递归:图片含有一个小部份与与整张图片相同。Droste最初是荷兰一个可可的厂牌,它运用递归视觉效果设计的包装,使这厂牌名闻于世。而创作出Droste effect效果的是错觉图形大师Escher,为什么不叫Escher Effect呢,MS太多经典的错觉图片都是出自他之手,关于他又可以写篇博文。

    
记得一本很招摇的《A New Kind of Science》里,Wolfram提出计算等价性的原理(Principle of Computational Equivalence,PCE)。这个原理是说,任何一个足够复杂的物理过程都有可能是支持通用计算。Wolfram甚至怀疑自然界不存在所谓的随机行为,那些看似随机的过程很有可能也是支持通用计算的,因此也是复杂类型的。

上面段在装比耍挑,请忽略= =…其实想说Droste effect可以通过Mathmap, GIMP生成。具体的教程可以上很Xe的煎蛋,(居然2007年就有写文章了,从下面的回复看那时煎蛋还是很纯洁的= =,我是不小心挖到煎蛋的坟的)。
更多图片可以去膜拜flickr上的Droste Effect小组。最牛B轰轰就是把Droste effect用在MV里:Wild Beasts & Clap Your Brains Off,很华丽~~