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的重要地位至今仍然没有改变,许多UNIX系统中仍然使用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 Shell是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中详细列出了各版本的具体情况。
表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。命令如下:
[root@localhost ~]# vi /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/tcsh /bin/csh
在Linux中,这些Shell是可以任意切换的,命令如下:
[root@localhost ~]# sh #切换到sh sh-4.1# #sh的提示符界面 sh-4.1# exit exit #退回到Bash中 [root@localhost ~]# csh #切换到csh [root@localhost ~]# #csh的提示符界面,和Bash一致
用户信息文件/etc/passwd的最后一列就是这个用户的登录Shell。命令如下:
[root@localhost ~]# vi /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin …省略部分输出…
大家可以看到,root用户和其他可以登录系统的普通用户的登录Shell都是/bin/bash,也就是Linux的标准Shell,所以这些用户登录之后可以执行权限允许范围内的所有命令。不过,所有的系统用户(伪用户)因为登录Shell是/sbin/nologin,所以不能登录系统。