共计 1617 个字符,预计需要花费 5 分钟才能阅读完成。
我们比较熟悉 Windows 系统的图形化界面,对于图形界面来说,用户点击某个图标就能启动某个程序。
在此之前我们一直在使用 Linux 系统的命令行模式学习,对于命令行来说,用户输入一个命令就能启动某个程序。
这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。
然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),所以就需要另外再开发一个程序,使该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。同时内核执行完成的结果,也经过该程序的处理,返回给用户。
如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。
用户界面和命令行就是我们所说的这个另外开发的程序,就是这层“代理”,在 Linux 下的这个命令行程序就叫做 Shell。
Shell 所处的位置如下图所示:
总结:
Shell 的英文含义是“壳”。
Shell 是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,返回给用户。换句话说,Shell 是为用户与机器之间搭建成的一个桥梁,让我们能够通过 Shell 来对计算机进行操作和交互,从而达到让计算机为我们服务的目的。
Shell 独立于内核,内核是 Linux 系统的心脏,从开机自检就驻扎在计算机内存中,直到计算机关闭为止。用户的应用程序存储在计算机硬盘上,仅当需要时才被调入内存。
Shell 是一种应用程序,当用户登陆 Linux 系统时,Shell 就会被调用到内存执行。
(1)第一种方式:交互式(Interactive)
是用户直接在 Shell 界面(终端界面)上执行 Shell 命令,由于 Shell 界面的关系,大家都习惯一行行的书写,很少写出成套的程序来一起执行,所以也称命令行。(换句话说我们操作的终端就是一个 Shell)
(2)第二种方式:批处理(Batch)
是用户事先编写一个 Shell 脚本文件,内含 Shell 脚本,而后使用 Shell 程序执行该脚本,这种方式我们习惯称为 Shell 编程。(简单的理解脚本就是一堆命令的集合。)
Shell 脚本就是把命令、变量和流程控制语句等有机的结合起来。
Shell 脚本擅长处理纯文本类型的数据,而 Linux 系统中,几乎所有的配置文件,日志文件,都是纯文本类型文件。
任何代码最终都要被“翻译”成二进制的形式才能在计算机中执行。
有的编程语言,如 Java、Go 语言等,必须在程序运行之前将所有代码都翻译成二进制形式,也就是生成可执行文件,用户拿到的是最终生成的可执行文件,是看不到源码的。这个过程叫做编译(Compile),这样的编程语言叫做编译型语言,完成编译过程的软件叫做编译器(Compiler)。
而有的编程语言,如 Shell、JavaScript、Python 等,需要一边执行一边翻译,不会生成任何可执行文件,用户必须拿到源码才能运行程序。程序运行后会即时翻译,翻译完一部分执行一部分,不用等到所有代码都翻译完。这个过程叫做解释,这样的编程语言叫做解释型语言或者脚本语言(Script),完成解释过程的软件叫做解释器。
编译型语言的优点是执行速度快、对硬件要求低、保密性好,适合开发操作系统、大型应用程序、数据库等。
脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合 Web 开发以及小工具的制作。
Shell 就是一种脚本语言,我们编写完源码后不用编译,直接运行源码即可。