购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 Shell简介

在第1章中,我们曾简单提到过Shell。那是在讲解Linux下的常用命令时向读者提到的Shell终端。的确,Shell给Linux使用者最直观的感受便是用户与系统内核之间进行交互的一个接口层——终端。在Fedora 14下,用户可以单击“应用程序”→“系统工具”→“终端”,来运行Shell终端,此时,用户实际就进入了Shell。

2.1.1 关于Shell

在计算机科学中,Shell俗称“壳”(用来区别于“核”),是指提供给使用者使用操作系统界面的软件(命令解析器),类似于DOS下的command.com。Shell的作用是遵循一定的语法将输入的命令加以解释并传给操作系统内核,它为用户提供了一个向Linux发送请求以便运行程序的接口,用户可以使用Shell来启动、挂起、停止甚至是设计编写一些程序。Shell接收用户命令,然后调用相应的应用程序。同时,Shell又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括顺序、循环和分支。

Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中的其他应用程序所调用。用户在终端提示符下输入的任何命令都先由Shell解释后再传给Linux核心。

有一些命令,如改变工作目录命令cd,是包含在Shell内部的。还有一些命令,如复制命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在Shell内部还是一个单独的程序。Shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后Shell在搜索路径里寻找这些应用程序(搜索路径是一个能找到可执行程序的目录列表)。如果输入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,则该内部命令或应用程序将被分解为系统调用并传给Linux内核。

Shell的另一个重要特性是,它自身就是一个解释型的程序设计语言(interpreted programing language)。Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。Shell编程语言简单易学,任何在提示符中能输入的命令都能放到一个可执行的Shell程序中,因此,Shell程序有时也被称为Shell脚本,本文对这两种叫法不做区分。

2.1.2 Shell的使用

在Linux命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字都必须由空格或Tab隔开,格式如下:

或者:

说明

提示符“$”和“#”区分了用户的不同权限,“$”表示普通用户权限,而“#”代表的是根用户(超级用户)权限。

选项是包括一个或多个字母的代码,它前面有一个减号(减号是必需的,Linux用它来区别选项和参数)。选项可用于改变命令执行的动作的类型。

命令行实际上是一个可以编辑的文本缓冲区,在按回车键之前,可以对输入的文本进行编辑。例如,利用“BackSpace”键可以删除刚输入的字符。可以进行整行删除,还可以插入字符,使得用户在输入命令(尤其是复杂命令)时,若出现输入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。

使用上箭头可以重新显示刚执行的命令,利用这一功能可以重复执行以前执行过的命令,而无须重新输入该命令。

bash保存着以前输入过的命令的列表,该列表被称为命令历史表。按上箭头,便可以在命令行上逐次显示各条命令。同样,按下箭头可以在命令列表中向下移动,这样可以将以前的各条命令显示在命令行上,用户可以修改并执行这些命令。

在一个命令行中还可以置入多个命令,用分号将各个命令隔开,这些命令将按顺序执行。也可以在几个命令行中输入一个命令,用反斜杠将一个命令行持续到下一行。总之,Shell命令行的输入灵活方便,当用户熟悉Linux的命令之后,更加能体会到这一点。

这里,先来看一个当Shell作为程序设计语言时应如何编写脚本的例子,代码如程序2.1所示。

首先,使用touch命令创建一个普通的文本文件sample_shell.sh,然后使用编辑器打开它,输入程序内容。

【程序2.1】一个Shell程序的简单示例:sample_shell.sh。

编辑完毕后,保存关闭sample_shell.sh,使用下面的命令修改文件执行权限:

说明

因为使用touch命令创建的文件默认没有可执行权限,所以需要使用chmod改变文件权限。本书将在第7章向读者讲解文件访问权限的相关内容。

运行脚本程序sample_shell.sh,输出结果如下:

看到这里,读者也许会感叹,Shell程序只不过是将一些Shell命令堆积在一起的代码段。确实如此,Shell程序中的执行主体正是一系列的命令块,加上各种变量、判断条件,以及各种程序控制结构,便可以编写出功能强大的Shell程序。有人甚至这样总结了Shell程序:

提示

使用Shell帮助

第一次使用Shell时可能会感到害怕,因为所能看到的只是一个提示符。如何知道哪些命令可用、命令使用什么选项或者如何使用高级特性?幸运的是,系统提供了很多帮助。下面是对本章的学习内容提供的补充内容。

(1)检查PATH:输入echo $PATH就能看到一个包含立即可用命令的目录列表。列出的这些目录内容可显示多数标准的Linux命令。

(2)使用help命令:有些命令内建于Shell中,所以它们不会出现在目录中。Help命令列出这些命令并显示每个命令的可用选项(输入help|less浏览整个列表)。要寻求特定内置命令的帮助,可输入help command,用所需的命令名代替command。Help命令仅在bash shell中有效。

(3)将--help与命令一起使用:很多命令包括--help选项,使用它可获取有关如何使用该命令的信息。例如,date--help|less的输出不但显示选项,而且显示使用date命令的时间格式。

(4)使用man命令:如果想了解有关特定命令的更多信息,可输入man command(用所需的命令名代替command),屏幕上会显示该命令的描述及其选项。

2.1.3 常见Shell的种类

Linux Shell的种类很多,目前流行的Shell包括ash、bash、ksh、csh、zsh等,用户可以通过查看/etc/shells文件中的内容来查看自己主机中当前有哪些种类的Shell,命令如下(下面是在笔者Linux主机中查看信息的结果):

使用下面的命令可查看Linux当前正在使用的Shell类型:

SHELL是一个环境变量,它记录了Linux当前用户所使用的Shell类型,前面加上“$”符号,意在引用该变量的值。用户可以通过直接输入各种Shell的二进制文件名(因为这些二进制文件本身是可以被执行的),进入到该Shell下,如进入csh可以直接输入:

这个命令为用户又启动了一个Shell,这个Shell在最初登录的那个Shell之后,称为下级的Shell或子Shell。使用命令:

可以退出这个子Shell。使用不同的Shell的原因在于它们各自都有自己不同的特点,下面简单介绍Linux下各种不同的Shell类型的特点。

1.ash

ash Shell是由Kenneth Almquist编写的,是Linux中占用系统资源最少的一个小Shell,它只包含24个内部命令,因而使用起来很不方便。

2.bash

bash是Linux系统默认使用的Shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的Shell是因为它具有以下特点:

(1)可以使用类似于DOS下面的doskey功能,用上、下方向键查阅和快速输入并修改命令;

(2)自动通过查找匹配的方式,给出以某字串开头的命令;

(3)包含了自身的帮助功能,只要在提示符下面输入help就可以得到相关的帮助信息。

3.ksh

ksh是Korn Shell的缩写,由Eric Gisin编写,共有42条内部命令。该Shell最大的优点是几乎和商业发行版的ksh完全相容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。

4.csh

csh是Linux比较大的内核,它由以William Joy为代表的共计47位作者编写完成,共有52个内部命令。该Shell其实是指向/bin/tcsh的一个Shell,也就是说,csh其实就是tcsh。

5.zch

zch是Linux最大的Shell之一,由Paul Falstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样的Shell的。 jvhFkA4b02XeLI7SpoD8Qyn+IKksZWYq2zef1+FXmSuv4ANAs5sVmivAx6uOWp+5

点击中间区域
呼出菜单
上一章
目录
下一章
×