Shell简介——Shell的概念与作用(一个应用程序或者说解释器)

 本文源于网络资源的学习与整理,非原创,如有侵权请告知删除。

一、Shell的概念

shell的意思是“壳”,如果理解shell在linux中的作用(内核的外壳,既保护内核,也向用户提供操作内核的接口),就能明白它的形象。

1、Shell是一个应用程序

对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。

然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。

由于安全、复杂、繁琐等原因,用户不能(也没有必要)直接接触内核,需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。

用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 shell。这里之所以强调在Linux下,是因为shell这个概念是Linux系统中才有的。

Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。

Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,它和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux,不启动 Shell 的话,用户就没办法使用 Linux。

由博文几种常见的shell:sh、bash、csh、tcsh、ash第四点可知,shell这个应用程序一般位于/bin或者/user/bin目录下。

2、Shell是一种脚本语言

任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。

从运行方式来分类,编程语言分为编译型语言解释型语言

有的编程语言,如 C/C++、Pascal、Go语言、汇编等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,看不到源码。这个过程叫做编译,这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器。

有的编程语言,如 Shell、JavaScript、Python、PHP等,需要一边翻译一边执行,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言,完成解释过程的软件叫做解释器。

编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、具有复杂业务逻辑的中大型应用程序、数据库等。而脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合Web开发以及一些实用的、自动化的小工具的制作,比如检测计算机的硬件参数、一键搭建Web开发环境、日志分析等。

shell 虽然没有 C/C++、Java、Python 等强大,但也支持基本的编程元素,例如:if...else 选择结构,switch...case 开关语句,for、while、until 循环;变量、数组、字符串、注释、加减乘除、逻辑运算等概念;函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。

站在这个角度来看,Shell 也是一种编程语言,它的编译器(解释器)是 shell 这个应用程序。我们可以在 shell 中编程,这和使用 C/C++、Java、Python 等常见的编程语言并没有什么两样。

我们平时所说的shell,有时候是指连接用户和内核的那个应用程序,有时候又是指 Shell 编程。

二、Shell的作用 

上面提到,shell 可以将内核与用户连接起来,具体表现为:

(1)shell可以解释用户输入的命令,并将它传递给内核。

(2)shell可以调用其他程序(同时给其他程序传递参数与数据),并获取其他程序的处理结果。

(3)shell可以在多个程序之间传递数据,即把某一个程序的输出作为另一个程序的输入。

(4)shell 本身也可以被其他程序调用。

其中第(1)点的细述见下面的第1节,第(2)(3)(4)的细述见下面的第2节内容。

1、Shell 如何连接用户和内核的?

shell 能够接收用户输入的命令,并对命令进行处理,处理完毕后再将结果反馈给用户,比如输出到显示器、写入到文件等,这就是大部分读者对 shell 的认知。你看,我一直都在使用 shell,哪有使用内核哦?我也没有看到 shell 将我和内核连接起来呀?!

其实,shell 程序本身的功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。我们运行一个命令,大部分情况下 shell 都会去调用内核暴露出来的接口(即内核提供的函数),这就是在使用内核,只是这个过程被 shell 隐藏了起来,它自己在背后默默进行,我们看不到而已。

接口其实就是一个一个的函数,使用内核就是调用这些函数。这就是使用内核的全部内容了吗?嗯,是的!除了函数,你没有别的途径使用内核。

比如,在 Shell 中输入“cat log.txt”命令就可以查看 log.txt 文件中的内容,然而,log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道,它只能去调用内核提供的 open() 和 read() 函数,告诉内核它要读取 log.txt 文件,请帮助它,然后内核就乖乖地按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后再由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程中 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据,只是用户不知道罢了。

2、Shell 还能连接其它程序

在 Shell 中输入的命令,有一部分是 Shell 本身自带的,这叫做内置命令;有一部分是其它的应用程序,这叫做外部命令。

Shell 本身支持的命令并不多,功能也有限,但是 Shell 可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。

更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,也就是把一个程序的输出结果传递给另一个程序作为输入。

大家所说的 Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。Shell 就是一个领导者,这正是 Shell 的魅力所在。

可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值