趣谈shell节选:精灵小黑,分身有术
本文更新日期:2019年9月24日
打开shell,出现一个黑色的窗口,即是小黑,它是shell进程。
小黑是个精灵,是个活生生的精灵。你可以给小黑打个招呼:echo Hello,小黑给你一个回复:Hello。如下所示:
[root@localhost ~]# echo Hello
[root@localhost ~]# Hello
最神奇的地方在于:小黑还可以诞生出一个小小黑,你可以执行:sh xxx.sh,这个时候就会诞生出一个小小黑。至于它是不是黑的,不好说,但是可以肯定的说,它是小黑诞生的。准确的叫法是:子进程。
只要在小黑面前执行sh xxx.sh命令或者./xxx.sh,小黑就会诞生出一个小小黑,既然这么容易分身,那么就有人开始担心了:我在小黑那里存放的东西,小小黑是否知道呢?
确切的说,在小黑那里存放的东西,小小黑是不知道的。用户存放的东西,叫用户变量,只在当前小黑中可见,小小黑是看不见的。要想让小小黑也能看到用户存放的东西,必须设置为导出,也就是export。天知道小黑能诞生出多少个小小黑呢,所以凡是用export设置的变量都称为环境变量。
小黑的东西,小小黑是看不到的,那问题来了,小小黑的东西,小黑能看到吗?答案是:不能的。那如果有人想让小小黑给小黑传话,怎么破?不能破啊,干嘛非得多此一举呢,直接跟小黑对话吧,越过小小黑,用source的方式,也就是source xxx.sh的方式,这个时候就不会再平白无故冒出个小小黑了。
后记:解决变量的可见与可用两大难题,Export和Context联袂出手,枯木又逢春
从文中提到的:父进程->子进程,用户变量->export->环境变量。解决了变量的可见性问题。下一个问题就是可用性,如何在子进程中获取到环境变量呢?我联想到了Context,这个时候该Context出手了,此乃“上下文”之意,是给“变量”创造”环境”。所有的环境变量集聚到一起,这种集合就叫上下文。
我们知道,程序是由各种模块组成,一个模块的正常运行,除了自身内部变量参与其中,还需要召唤其他模块的外部变量,共同协作。去哪里召唤这些外部变量呢?从Context里面获取即可。
在编码世界中,Context的编码手法无处不在:
(1)在Tomcat里面,每一个Tomcat上下文都表示一个Web应用。
(2)在Spring里面,有两个核心接口:BeanFactory和ApplicationContext。
(3)在MyBatis里面,有ErrorContext,记录本次执行过程中异常的上下文信息。
(4)在Android里面,Context是个抽象类,是其他三个重要类(Activity、Service、Application)的父类。
(5)在HttpClient里面,有HttpContext,表示HTTP的上下文执行环境。
(6)在kafka里面,有LogContext,顾名其意,用于log的执行环境。
(7)……
在IT世界中,Context的编码手法无处不在,可以说,有程序的地方必有Context。
当你的代码,写的繁琐无味,死气沉沉,如白开水一般平淡,你可祭出Context手法,我相信,必能枯木逢春,让腐朽的代码充满生机。