(转)盗梦终端:如何进入第1000层梦境

本文介绍如何使用Shell脚本模拟电影《盗梦空间》中的多层梦境概念,通过不断执行bash命令达到层层嵌套的效果,并探讨了Bash支持的最大层级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到一篇比较有意思的文章,果断分享。原文出处 Linux桌面中文网。

“盗梦空间(Inception)”刚刚在国内上映那会(2010年9月1日)我就去看了,确实是一部好电影。后来还在网上看到说盗梦空间就像是一层层的“函数调用”,确实很形象(见此:Inception:一场层层调用的函数大战 )。

今天看推时,突然看到一条,说是Shell有个变量:$SHLVL,是查看当前Shell的级别(Level)。我立马一试,果然如此,简直就是Inception的翻版!

我们在使用Shell(以Bash为例)的过程中,实际上就是一个Inception的过程:执行一个脚本的时候,并不是在当前的Shell环境下执行的,而是另起一个Shell,在里面执行,执行完毕后,销毁它,并回到当前的Shell。

一般情况下,我们的Shell都是第一层,如图:

Inception Terminal 01

如何进入下一层呢?只需要不停地执行自身(bash)即可,如图,执行了三次bash后,成功进入了第四层Shell:

Inception Terminal 02

与Inception一样的是,想要回到前一层,必须得执行“exit”完成任务,或者被“kill”。假如很不幸第一层被kill掉的话,后面的N层梦境都没有了(父进程退出,子进程也遭殃)。

问题来了:Shell到底支持几层梦境呢?在看了Bash的源码后,我发现它竟然支持1000层!在Bash源码的variables.c,约4680行左右中有这样的定义:

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层后,又回到第1层,也就是现实世界了?

于是我就想进入1000层看看,如何方便的进入第1000层Shell呢?for loop一次次套一个bash命令肯定是行不通的,因为在进入下一层Shell后,上层的Shell的命令就不再对这层起作用了。

我想了很多方法都行不通,最后只好去请教神通广大、无所不能的华主席(@shellexy)。华主席就是牛逼,马上就给了一个解决方案,用Pygtk来Inception至N层!

原理是这样的:

使用GTK+的vte库来创建一个虚拟终端,通过vte.Terminal的paste_clipboard方法,不停地注入“bash /n”,于是该Terminal就能按照你想要的方式进入N层梦境了。源代码如下:

#!/usr/bin/python



import vte, gtk



window = gtk.Window()

window.set_default_size(480, 320)

window.set_title('Inception')

window.connect('destroy', lambda *w: gtk.main_quit())



sw = gtk.ScrolledWindow()

sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)



term = vte.Terminal()

term.set_emulation('xterm')



sw.add(term)

window.add(sw)

window.show_all()



term.fork_command()

clipboard = gtk.Clipboard()



for i in range(1000):

clipboard.set_text('echo $SHLVL /n bash /n')

term.paste_clipboard()



gtk.main()

代码很简单,基本上不需要讲解。关键的便是clipboard的剪贴版操作及terminal的粘贴动作。

不过,如果你想真正进入第1000层,可是有点难的。这要取决于你的电脑是否有够强劲的CPU,是否有足够的内存——当然还有你是不是有足够的耐心。

在我的电脑上,我跑了很久……基本上是这篇日志开始写的时候开始跑的,一直到日志写完,还只有进入第三百多层,接下来每一层的进入都会花很多的时间,可以说是越来越慢。同时,我的物理内存(2GB)已经消耗完毕,开始烧SWAP了。

来两张图吧,壮观的“盗梦终端”:每一层都在“do_wait”下一层的完成……

Inception Terminal 03

pstree命令的效果:bash-bash-bash……实在是显示不过来了。

Inception Terminal 04

写完这篇日志时,我已经Inception至四百多层了,SWAP大概还有1700MB,看似可行,不过同时我的机器反应速度也越来越慢了,我还是先把日志发表了吧~

操作系统的世界,还真是跟现实相当类似啊。当然操作系统世界要比当前人类世界领先多了,比如fork(),哈哈。

我在想,要不大家来一个Inception至一千层的比赛,看谁的机器比较给力,能在最短的时间进入呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值