- 细说Linux系统管理(第2版)
- 沈超编著
- 1570字
- 2021-01-05 18:33:25
2.1 Shell 概述
2.1.1 什么是Shell
我们平时所说的Shell 可以理解为Linux 系统提供给用户的使用界面。Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境。当一个用户登录Linux 系统之后,系统初始化程序init 就会根据/etc/passwd 文件中的设定,为该用户运行一个被称为Shell 的程序。
确切地说,Shell 是一个命令行解释器,它为用户提供了一个向Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用Shell 来启动、挂起、停止甚至编写一些程序。Shell处在内核与外层应用程序之间,起着协调用户与系统的一致性、在用户与系统之间进行交互的作用。如图2-1所示是Linux 系统层次结构图,Shell 接收用户输入的命令,并把用户输入的命令从类似abcd 的ASCII 码解释为类似0101的机器语言,然后把命令提交给系统内核处理;当系统内核处理完毕之后,再通过Shell 把处理结果返回给用户。
图2-1 Linux 系统层次结构图
Shell 与其他Linux 系统命令一样,都是实用程序,但它们之间还是有区别的。一旦用户注册到系统后,Shell 就被系统装入内存并一直运行到用户退出系统为止;而一般命令仅当被调用时,才由系统装入内存执行。
与一般命令相比,Shell 除了是一个命令行解释器,还是一门功能强大的编程语言,易编写,易调试,灵活性较强。作为一种命令级语言,Shell 是解释性的,组合功能很强,与操作系统有密切的关系,可以在Shell 脚本中直接使用系统命令。大多数Linux 系统的启动相关文件(一般在/etc/rc.d 目录下)都是使用Shell 脚本编写的。与传统的编程语言一样,Shell 提供了很多特性,这些特性可以使Shell 脚本编程更为有用,如数据变量、参数传递、判断、流程控制、数据输入和输出、子程序及中断处理等。
说了这么多,其实我们在Linux 系统中操作的字符界面就是Linux 系统的Shell,也就是Bash。但是,图形界面是Shell 吗?其实,如果从广义上讲,图形界面当然也是Shell,因为它同样用来接收用户的操作,并传递到内核进行处理。不过,这里的Shell 主要指的是Bash。
2.1.2 Shell 的类别
目前Shell 的类别有很多种,如Bourne Shell、C Shell、Bash、ksh、tcsh 等,它们各有特点,下面简单介绍一下。
最重要的Shell 是 Bourne Shell,这个命名是为了纪念此Shell 的发明者Steven Bourne。从1979年起,UNIX 系统就开始使用Bourne Shell。Bourne Shell 的主文件名为sh,开发人员便以sh 作为Bourne Shell 的主要识别名称。
虽然Linux 系统与UNIX 系统一样,可以支持多种Shell,但是Bourne Shell 的重要地位至今没有改变,在Linux 系统的各个版本中仍然使用sh 作为重要的管理工具。它的工作从开机到关机,几乎无所不包。在Linux 系统中,用户Shell 主要是Bash,但在启动脚本、编辑等很多工作中仍然使用Bourne Shell。
C Shell 是广为流行的Shell 变种。C Shell 主要在BSD 版的UNIX 系统中使用,其发明者是加利福尼亚大学伯克利分校的Bill Joy。C Shell 因为其语法和C 语言的语法类似而得名,这也使得UNIX 系统工程师在学习C Shell 时感到相当方便。
Bourne Shell 和C Shell 形成了Shell 的两大主流派别,后来的变种大都吸取了这两种Shell的特点,如Korn、tcsh 及Bash。
Bash 是GNU 计划的重要工具之一,也是GNU 系统中标准的Shell。Bash 与sh 兼容,所以许多早期开发出来的Bourne Shell 程序都可以继续在Bash 中运行。现在使用的Linux 系统就使用Bash 作为用户的基本Shell。
Bash 于1988年发布,并在1995—1996年推出了Bash 2.0版本。在这之前,广为使用的版本是1.14版本。Bash 2.0版本增加了许多新的功能,以及具备更好的兼容性。
表2-1详细列出了Shell 各类别的具体情况。
表2-1 Shell 各类别的具体情况
注意:Shell 的两种主要语法类型有Bourne 和C,这两种语法彼此不兼容。Bourne 家族主要包括sh、ksh、Bash、psh、zsh;C 家族主要包括csh、tcsh(Bash 和zsh 在不同程度上支持csh 的语法)。
本章讲述的脚本编程就是在Bash 环境中进行的。不过,在Linux 系统中,除了可以支持Bash,还可以支持很多其他的Shell。可以通过/etc/shells 文件来查看Linux 系统支持的Shell。命令如下:
在Linux 系统中,这些Shell 是可以任意切换的。命令如下:
用户信息文件/etc/passwd 的最后一列就是这个用户的登录Shell。命令如下:
可以看到,root 用户和其他可以登录系统的普通用户的登录Shell 都是/bin/bash,也就是Linux 系统的标准Shell,所以这些用户在登录之后可以执行权限范围内的所有命令。不过,所有的系统用户(伪用户)因为登录Shell 是/sbin/nologin,所以不能登录系统。