什么是shell外壳程序?一篇文章带你理解透彻!!

前言

本篇文章主要是浅谈一下 shell 运行原理中的其中一个 —— shell 外壳程序。
在谈论这个话题的时候呢,不外乎就是几个问题
1、外壳程序是什么?(也就是怎么理解的问题)
2、为什么有外壳程序?(也就是外壳程序有什么作用)

OK,废话不多说,我们进入今天的主题 —— 外壳程序。

外壳程序是什么,对于现在来说,我们确实不知道。但是呢,我们知道在现实生活中呢,有很多专业性非常强的事情,我们做不了,所以我们需要借助其他人的帮助,来帮我们完成我们想做而又做不了的事情。

接下来,我将通过几个事例,来带大家理解,由于事情具有的专业性,因此我们需要通过别人来帮助我们完成我们想完成的事情。


1. 铺垫故事


事例一:
比如说,我想去银行存钱,并不是让我自己拿着我的钱,然后来到银行的系统面前,在系统中找到自己的账户,然后自己将存款添加到我的账户里头,然后再自己再把钱存入银行的小金库里边。

而银行的系统需要怎么操作,我又该如何将自己想要存储的金额添加到我的账户当中,然后又如何将我的钱,存入到银行的小金库里头。

上述这些事情,对于我们来说,是具有一定的专业性的!!我们也不知道如何解决这些事情!!就算我们知道,银行也不会将这些事情,交给我们自己解决!!!而是银行招聘了一批工作人员,来帮助我们完成 ”存款“ 这一件事。我们想要存多少钱,我们只需要告诉银行的工作人员,就可以了。

事例二:
比如说,我今天想要盖一栋房子,那我自己肯定是不会盖房子的。所以我找了相关行业的设计师来帮我设计房子的结构,我找了建筑工人来帮助把房子搭建起来。因为在盖房子这件事情上,你不具备专业性,所以你不相信自己,你也不会将这件事交给自己解决,而是通过其他人,来帮助你完成(当然,在现实生活中,这肯定是要钱的嘛!)!!!

事例三
一个优秀的出租车司机,他不一定需要具备修车技能,他只需要知道怎么开车就可以了。而至于修车这件事,那就是其他相关行业的专业人员来做了!

OK,我们赶紧小小的总结一下:
我要做一件事,我不一定要让我自己参与做这件事的相关细节,我也可以只是使用一下别人提供给我的方式。所以这就是,由于事情具有的专业性,因此我们需要通过其他人来帮助我们完成我们想完成的事情。

2. 我们真的在直接访问操作系统吗?


事例四
我们都知道操作系统是计算机不可或缺的一个软件!而操作系统就是通过管理好软硬件资源这种手段,来为上层用户提供良好的使用环境的目的。目前,我们对操作系统的理解也就只能是这么多了!!

但是,我不难发现,我们在进行系统操作的时候,无外乎就是两个方式,要么就是通过图形化界面来点击操作,要么就是通过指令来操作

那么这里就有一个问题:我们普通人,能不能直接去访问操作系统呢???

那有人就有疑惑了!“难道我之前不是直接访问操作系统吗??”
“我在windows操作系统,打开的各种软件,能进行各种文章编写,等等,这些都不算我在直接访问操作系统吗???”
那还有人就说了,行,上面这些都不算是我在直接访问操作系统,那我在Linux下通过指令去进行系统操作,我不就是在直接访问操作系统吗??
==》
答案是,上面这些,都不算是直接在访问操作系统!!


那听到这,有人就要问了,那什么样的行为才算是直接访问操作系统呢???
==》
这个问题就好比我们刚刚讲的几个事例中,类似 ”我在银行存钱“ 这件事情上,如果我不需要工作人员协助我完成这件事,我可以自己来到银行的系统前,然后找到存放客户的数据,然后我可以自己对自己的账号进行一系列操作,更新我的账号余额,我自己也知道我的钱应该存放到银行的哪个金库等等,关于 “我要存钱” 这件事的所有相关细节,全部都是我自己一个人独立完成的,那么我才算是在直接访问操作系统!!
==》
换言之,我如果想要直接访问操作系统,然后往显示器打印一些数据,那么我就需要知道 显示器是什么,在在操作系统的什么位置?我想让操作系统往显示器上写数据,那我的数据应该如何交给操作系统,而操作系统有没有把数据输出到显示器上,有没有输出成功,成功或者不成功,我应该怎么知道呢?出问题了,我又该怎么处理。像所有的这些操作细节,我们都是要关心的!!这才算是我们直接在访问操作系统。
==》
那按你这么说的话,上述所有的细节如何处理我都不知道,我也似乎没有关心过,所以可以证明我并不是直接在访问操作系统,而是如同银行一样,有 ”人“ 在协助我 ”访问操作系统“ 这件事吗??
==》
答案是,没错!就是有 “人” 在协助我们访问操作系统!!!


那为什么我们不可以直接访问操作系统呢??

其实也不是不可以,只不过是,直接访问操作系统这件事情上,它的专业性太强,门槛太高了。如果说,银行存钱都是自助的,都是我们自己对银行系统进行操作,然后更新自己的账户,也是自己去金库里存钱取钱,这样的话:

a、 对于我们来说,我们需要学会如何操作银行的账户系统,需要学会如何去金库去存钱取钱等等一系列银行的细节工作问题,那对于我们普通人来说,操作成本就太高了,对我们就非常不友好!!(试想一下,有时候我们去银行办理业务,填个表单,我们都需要银行工作人员的帮助才能够完成,何况是整一套银行的体系工作呢)

b、 作为银行的管理者,他愿不愿让你直接去操作银行的账户系统,或者让你进入银行的金库存钱取钱呢?? ==》
答案是,他不愿意!他肯定不愿意啊!为什么?? 因为他不相信你啊!!(也就是所谓的安全问题)
你说让我自己操作自己的账户系统,然后自己去金库存钱取钱,那我今天存了100块钱,我在我的账户上加了一万块钱,然后我去小金库里面取了十万块钱。那你说,换你是银行老板,你受得了??
又或者,你对银行的系统不熟悉,你在存取钱的过程中,不小心操作失误了,导致银行系统奔溃了等等各种安全问题,所以你是银行老板,你也受不了一点!!


OK,讲到这里,我们赶紧总结一下:

所以 “人” (也就是作为用户的我们)不直接访问操作系统的原因,无外乎就是:

1、“人” 不擅长直接访问操作系统(至于怎么不擅长,我们没办法细讲,因为操作系统是一个非常庞大的概念,我们可以理解为,就如同我们不擅长自己独立在银行办理业务一样)

2、假设真的有人擅长直接访问操作系统,那也是极少部分人(系统开发的那部分人),而其他人都是不擅长的,那么如果要让这些绝大部分不擅长的人,直接去访问操作系统的话,那么就会导致:
a、操作成本非常高。 就好比如果没有操作系统,让我们直接操作硬件,那我们是不是还得懂硬件(成本问题)
b、会带来各种安全隐患。 只要是人,就会犯错,所以如果让人直接操作 操作系统,那操作系统就可能会出问题。(安全问题)

所以系统设计者,不会让我们直接操作 操作系统!!(也就是所谓的银行不相信我们,操作系统的设计者,也不相信我们 )


讲到这里,可能有人还是有很多疑惑。上面讲了那么多,都是在围绕 ”我不是在直接访问操作系统“ 这件事。 ==》
好了,你现在告诉我,我不是在直接访问操作系统。那我是如何访问操作系统的呢?? ==》
还有,我在图形化界面上的一系列操作 和 各种指令操作,最终不是在系统上跑起来了吗??那图形化界面 & 指令操作,究竟是什么东西呢???

在解答这些问题之前呢,我还需要给大家讲个故事,来帮助大家理解这个问题的答案。

3. 我们是如何访问操作系统的?

3.1 什么是shell外壳程序

第一阶段:
在某个地方,有一个小村庄,村里有一个程序员张三,他爸呢,是这个村的村长,张三家呢,在这个村的东边。然后呢,在某一年临近春节期间,张三交代完手头的工作,就回家了!回到家后,他爸就跟张三说:“儿子啊,你呢,也找了一份不错的工作,按照咱们村的习俗啊,咱们都是立业之后就要成家!那你有没有女朋友什么的啊?“ 张三这个人呢,为了找一份好工作,花了很长时间,又是一个典型的宅男程序员!换言之呢,就是,张三根本就没有时间找女朋友,所以找女朋友的能力没有得到很好的锻炼!再换言之就是,张三他不擅长跟女孩子打交道!!

所以呢,他爸就去找了村西的王婆(听到这个名字,大家也都知道,王婆是个什么角色了),王婆呢,就是负责说媒,能言善辩,牵线搭桥,方圆十公里以内的婚嫁问题,就没有他搞不定的!!!

接着,王婆就来到了张三家里,知道了张三对隔壁家的如花有意思。如花是张三的小学同学,在小的时候,张三和如花青梅竹马,到后来上初中、高中、大学,两个人呢,就渐渐的没了联系。但是呢,张三还是没有忘记如花,而他自己又不擅长跟女孩子打交道,所以呢,张三就找了王婆,让王婆去如花家帮他问问底。

王婆了解完张三的情况之后呢,就来到了如花的家里,把隔壁家张三的基本情况和要求,通过自己的专业性,简单的向如花描述了此次前来的意图。等王婆说道完毕之后,如花就说了:“张三?张三是谁啊?我不认识他!所以算了吧,我们都不了解!!“ 听到这里,王婆也就回去了。

所以王婆就将此次前往说媒的结果,带回去告诉了张三,说:“你说的那个如花,人家说她根本就不认识你,所以她直接拒绝了你!!“


讲到这里,我们先把故事暂停一下!我们赶紧总结类比一下:
上述故事中呢,因为张三不擅长跟女孩子打交道,所以呢,张三需要找一个人来协助他完成 “找女朋友” 这件事!而故事当中的王婆,也就是张三所找的 “中间人” ,该人物的作用主要是,通过自己的专业性,将张三的需求传递给如花,传递完成后,将如花的反馈结果带回去传递给张三。

故事中的如花就好比我们的操作系统、张三就是用户,因为用户不善于和操作系统直接交互,所以就在用户和操作系统之间引入了一名新的角色,叫做王婆。而作为中间人王婆的存在,就是我们所谓的 shell 外壳程序!!

所以,我们现在就清楚了,什么是 shell 外壳程序呢?!! ==》
外壳程序就是用户与操作系统交互中间的软件层 ,负责将用户的请求传递给操作系统,再将操作系统的反馈结果,回传给用户,这就是 shell 外壳程序!!


实操演示 + 重新理解:

在这里插入图片描述
在 Linux 上,就好比,我们作为用户(张三),输入了一串指令,然后由 ”中间人“ —— shell 外壳程序(王婆) 将我们这一串指令交给给操作系统(如花)。操作系统收到 shell 外壳程序的请求之后,就说:” 这是个什么玩意??!我怎么不认识这个命名呢 !!” 所以操作系统就告诉 shell 外壳程序,让它回去反馈给用户说:“这个命名我找不到,不能执行!” 于是外壳程序就将操作系统的反馈结果,回传给用户!

所以我们也就可以回答上面的问题了:”那我是如何访问操作系统的呢“   ==》
通过中间的软件层 —— shell 外壳程序 访问的操作系统!

那图形化界面 & 指令操作,究竟是什么东西呢??? —— 就是我们所谓的 shell 外壳程序!


3.2 shell外壳程序有什么意义

第二阶段
被拒绝后的张三,就非常不愿意相信,如花已经把他忘记了!!后面突然,张三想起来,小的时候,他们都不叫对方的姓名,而是以别名称呼的对方!所以张三就赶紧再去找了王婆,让王婆以张三的别名 ”小张“ 再次带着一样的请求去到如花的家里。这次,听到对方是小张的如花,想起来了小张这个人,但是呢,她告诉了王婆:”王婆,我和小张确实认识,但是我不喜欢他,虽然他现在很优秀“。王婆听到如花说不喜欢张三,也就没有多说什么了。就再一次把如花的反馈结果,带回给了张三。

听到这里,我先问大家一个问题:
如花认识张三,但又把张三拒绝掉了,这是正常还是不正常??
==》
答案是,再正常不过了。我认识你,我就要答应你吗??就如同在 Linux 上,这条指令确实存在,系统也认识这条指令,那系统就要接受你的请求吗???

在这里插入图片描述

该案例是对上面例子的一个展现,上面这条指令是原原本本存在的!!系统也认识这条指令,但是系统驳回了你的请求,因为你没有权限,你不符合系统的要求!!这就类比于,如花认识张三,但不一定要接受张三!!因为张三不符合如花的要求,所以如花不喜欢张三!换言之呢,就相当于操作系统实际在执行用户通过外壳程序传递的请求的时候,不要觉得操作系统就必须得给用户执行,人家有权利拒绝!!


OK,我们继续故事的讲述!
可是呢,张三非常喜欢如花,还是想要如花当他的女朋友,所以张三就让王婆再去帮她跟如花沟通一下。王婆没办法,就去帮他办了。结果还是被如花拒绝了。拒绝之后, 张三就再让王婆去办,可是呢,这一次,王婆刚走到如花的家门口,就看到了另一个帅哥王五,也就是如花的男朋友!看到这里的王婆,心里也认为,张三是不可能的了!! 因为人家如花,已经有男朋友!!所以呢,王婆也没有继续与如花进行多余的沟通了,而是一如既往的回去告诉张三,”人家如花还是拒绝了你!你看看,要不要找其他人,我还认识村南的一位小姑娘翠花,长的可美了!你看要不要我去帮你说道一下?” 可是张三不要啊,张三只要如花,所以呢,张三还是让王婆帮他再去跟如花说一说。但是王婆已经知道了,如花名花有主了,所以呢,就直接的,拒绝了张三。

讲到这里,因为如花已经名花有主了,所以王婆面对张三各种无理请求的时候,也就没有继续去找跟如花沟通了,而是自己直接拒绝了张三。而王婆的这一行为,在另一方面,是不是也是变相的保护了如花呢???

而如花又类比为操作系统,王婆是shell外壳程序,张三是用户,所以换言之也就是,shell外壳程序直接拒绝用户请求的同时,也是变相的保护了操作系统!!

所谓变相保护了操作系统,就是王婆拒绝张三的再三请求时,王婆并没有将张三的请求传递给如花,也就是说,用户的指令并没有交付到操作系统上,而是在经过 shell 外壳程序的时候,就直接给中断了!!

OK,那我们赶紧小小的总结一下:第一阶段,王婆作为中间人,负责帮张三传递各种请求给如花,再将如花的反馈结果传回给张三。而在第二阶段,知道了如花已经有男朋友的王婆,面对张三的再三请求,在王婆看来,就是无理的请求,所以王婆直接拒绝了张三,也算是变相的保护了如花!
==》
所以 shell 外壳程序有什么意义呢??
1、作为用户和操作系统交互的中间软件层
2、在一定程序上,起着保护操作系统的作用!!

所以看到这里,其实我们也能够更好的理解为什么我们不能直接访问操作系统了,而是通过中间软件层去访问。 ==》
一方面,是因为操作系统的设计者不相信其他任何人
另一方面,我们需要清楚的是,只要是人,那么就一定会有犯错的时候,所以让人直接去访问操作系统,就可能会直接出问题,但是如果让我们先访问中间软件层,那么出了问题,也是软件层的问题,而操作系统则不会受到影响!!

3.3 shell外壳程序运行的本质

第三阶段
延续上面的故事线,那么故事应该是来到了,张三呢,非要让要王婆继续去替他向如花说媒,而王婆心理清楚,张三的这些请求,是绝对或者大概率失败的!所以王婆也就直接不接受张三的这些请求了。但是,我们可不要忘记,张三他老爸!可是村长!!所以王婆她非办不可啊!

所以呢,王婆就左右为难,“ 自己可是是方圆十里谈婚论嫁的牵线人啊,而现在又因为给张三说媒,说了都有十几次了,最后怎么都没有成功,那这传出去不就砸了自己的牌子吗?”

所以有没有一种办法,既让王婆把事办了,还能让王婆的牌子不砸呢??

王婆苦思冥想了一晚上,终于想出了一个好办法!那就是,招聘实习生,来替他去说媒。大家可以简单理解为,就是找人帮他背锅。所以呢,王婆就找到村长说,“我自己已经跟如花打了很多次道了,已经不合适继续去打扰如花了,所以我找个实习生,去帮你把这事给办了,办不成,我再继续找其他人帮你办“,所以村长就说了,“ 我不管你怎么做,你给我做了就行了!”

那么此时,实习生办事的结果是什么,已经不重要了!因为在实习生办事的同时,王婆还可以接待其他人的说媒请求。

至于为什么王婆一定得替村长把事办了,大家可以理解为,因为他是村长!是这个村至高无上的村长!王婆可以办不成事,但是不能不办!换言之,办不成 与 不办 是两码事!

至于怎么让实习生背这个锅,我们可以这样理解,一方面,如果办不成了,王婆可以向村长交代,是因为实习生刚出道,业务不太熟练等等各种理由,所以村长也不会怪罪于王婆了。另一个发方面,就算实习生把事办糟了,那传出去,也不会有损王婆的声誉,保住了王婆的招牌!!

对于上面的故事,我们接下里通过实操演示带大家再次理解。
在这里插入图片描述

我们可以看到的是,这条指令不存在,操作系统它不认识这条指令,通过外壳程序,所以它驳回了我们很多次,但是每次我们再次执行这条指令请求的时候,外壳程序还是去帮我们去办这件事!然后把最后的结果告诉我们。而不是说,“ 都跟你说多少遍,找不到这条指令了!你怎么还继续请求呢?” 对吧? 外壳程序并没有这样做,那这是为什么呢??

答案就是上面的故事!因为用户至上!操作系统是要为用户服务的,所以外壳程序也要为用户服务,秉承一个用户至上的理念。就算你(用户)是错的,就算你要一错再错,我(外壳程序)也需要忍着!没有为什么,因为用户至上!

然后再代入到我们这个故事,张三的请求是不合理的,在如花再三拒绝他之后,他还要求王婆继续给他说媒,(故事中说王婆是因为村长的存在,所以才一直给张三办事的,那是故事情节的需要,不然凭什么继续给张三办事,对吧?)所以这里的张三,就好比我们的用户,王婆就是外壳程序,就算张三再不合理,王婆也要把事办了,不管是通过什么方式。


最后,我们再拓展一下:
王婆找实习生帮她去办事,在故事层面上,王婆这样做的意义就是,保住王婆招牌的同时,王婆也可以继续为其他人说媒。

那我们经过类比,我们是不是可以猜测,外壳程序也是找其他子程序去帮他去执行用户请求的呢?==》 答案是,是的,没错,就是这样!

那么,在系统层面上,外壳程序这样做的意义就是,保住shell外壳程序这个幕后boss不倒闭的同时,也可以去执行其他用户请求!!

所以我们回过头看这个故事,也可以发现,其实王婆,就是所谓的幕后大boss!

而所谓的外壳程序就是 帮助用户将他们的请求交给操作系统,然后再由操作系统执行完后的结果反馈回给用户,所以外壳程序的本质就是 命令行解释器,它的核心作用就是将我们所对应的命令翻译给我们的内核去处理。换言之,这个中间软件层,也就是外壳程序的价值就是进行上下层交互的!

然后做命令行解析这件事,其实也不是shell外壳程序它自己去执行的,它只是将用户的请求接收下来,然后派生出一些子程序去帮他做命令行解析这件事。(就如同做大做强的王婆,可能后面都不会自己去说媒了,直接就是雇佣很多人,然后帮她做这么一件事情)


OK,整个故事呢,到这里也就告一段落了。
那我们说了这么久的 shell 外壳程序, 在 Linux 中的具体体现是什么呢?

在这里插入图片描述

我们可以看到,在 Linux 中,所谓的shell外壳程序,就是 bash,它也是一个文件!

而 shell 是对所有外壳程序的一个统称。在故事层面上就好比,王婆只是媒婆的其中一种,王婆就等价于我们 Linux 下的 bash,媒婆就等级于我们说的 shell 外壳程序。因为在不同的系统平台下,外壳程序的具体名称,可能是不同的!


总结

我们先是通过一系列的故事线,清楚了一个理念:可能很多我们想完成的事情,但并不需要我们自己参与其中的细节,然后引出了一个话题《我们是不是在直接访问操作系统》,然后再通过一系列故事线,证明了我们不是在直接访问操作系统,而这是因为我们普通人不擅长直接访问操作系统,如果让我们自己去访问,可能面临成本高、安全问题等,所以需要 “中间人” 来协助我们访问。也就顺势引出了 shell 外壳程序这个概念!也顺势清楚了《我们是如何访问操作系统的》。而所谓的 “中间人” ,还有我们之前学到的图形化界面、指令操作,全部都叫做外壳!而这种外壳程序存在的意义就是,一方面,作为用户和操作系统交互的中间的软件层,来达到上下层的交互的一个作用!另一方面,再面对用户的操作请求时,可以在一定程度上规避风险,保护操作系统。而外壳程序的本质就是命令行解释器,将用户的命令翻译给内核去处理,也就是让操作系统去处理。


OK,到这里,关于 shell 外壳程序,我就全部讲完了!
最后,如果我的文章能给你带来一定的帮助,或者是收获,我很开心。
同时,觉得对你有帮助的伙伴们,也可以 点赞👍 + 收藏⭐️ + 关注➕,支持一下!
感谢各位观看!!

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值