Linux有两种界面,一种是图形界面(GUI),另一种是字符界面(又称之为命令行界面),而命令行界面就是Linux中常说的shell界面。那么shell到底是什么呢?《Linux宝典》第三版(人民邮电出版社)中对于shell的解释是用来解释和处理命令的程序。根据这一点,我的理解是shell等同于DOS或Windows中的command,也就是一个命令解释器。对于DOS或Windows比较了解的用户都知道,在DOS或是Windows的cmd窗口中输入一条命令(比如dir命令),这条命令即是通过command.com这个程序来执行的。那么在Linux中所说的shell的意思,应该跟这个command类似,只不过名子不一样,但作用是一样的。换句话而言,我们所说的shell界面,其实就是如同DOS一样通过手工输入一条一条命令进行执行的界面。
虽然shell跟DOS的作用差不多,但其地位远远大于DOS在Windows中的地位。现在习惯使用Windows的人群中,即便一些自称为高手或专家的资深用户的主要工作通常也是习惯于在图形界面下完成,而DOS通常只会在一些特殊的地方使用,比如批处理、对磁盘进行分区等。而shell则完全不一样,因为“多数Linux专家认为shell比GUI更强大”,“很多很有能力的用户很少使用图形界面,他们用shell完成大部分工作”(摘自《Linux宝典》第三版)。所以学好shell是成为一个精通Linux的用户所无法避免的。
DOS中的命令解释器只有一种,所不同的只是随着版本的不同功能越来越强多,越来越强大。换个说法就是DOS6.22中的命令功能和数量比DOS3.1强大,而DOS7.0中的命令功能与数量又比DOS6.22强大,直到今天Windows下的DOS窗口则在命令的功能与数量更是达到了一个更高的高度(但不可否认的是,我们在Windows的图形界面下完成的一些工作已经是DOS所不能胜任的了)。
跟DOS不同的是,Linux中的命令解释器远不止一种,或者说shell不止一种,我们最常用的是bash shell(简称bash),除此以外还有ksh、tcsh、csh、sh等。使用不同的shell,那我们能执行的命令以及能实现的功能也会有所不同。换句话说,你换一个shell,则里面的命令有可能跟前一个shell中的命令不一样(我们不能说完全不一样,因为这些shell中有的是彼此兼容的)。之所以有这样的情况发生,我认为是因为Linux的开源以及Linux脱胎于UNIX这两个原因造成的(有兴趣的朋友可以了解一些Linux和UNIX的发展历史,这里面有很多有趣的故事)。正是因为Linux的开源,所以我们可以很容易的去获得它的核心源代码,在这个基础上,每一个人,只要他愿意并且有能力,那么都可以去开发一套自己的shell。这种情况对于一些初学者来说(比如我)有可能造成困扰,搞不清楚自己到底要学习哪一种shell,或是我学习某种shell后看不懂某个民间高手个人所写的shell怎么办?
事实上通过对Linux一段时间的了解后,我们就会明白,我们完全不需要为此烦恼。虽然前面所说的只要愿意,谁都可以去开发出一套只属于他个人的shell来,但实际上,有之样能力的毕竟不多,而且即便有这样的shell存在,但目前我们已经形成主流,能够成熟应用并且能够被大家所接受的shell只不过上面提到的那些。而且在一套Linux的发行版本中,通常会包括很多种shell,只要我们愿意,我们可以随时在这很多种shell中切换或选择。所以对于大多数初学者来说,我们只要掌握住其中的一种shell即可。目前在Linux中默认的shell是bash,我想我们一般也只需要学习这一种即可,当然,如果你愿意,你也可以去学习更多的shell。
这里面要顺便提一下,我身边的一些同事经常会说“我写的一个shell”,事实上,这儿他们所说的shell是指一个shell脚本,跟我们上面所提到的shell完全不是一回事。我不知道其他的学习linux的朋友中是不是也有这样的人,但实际上shell和shell脚本是完全不同的概念。所以千万不要认为开发一种shell是一个很容易的事,至少以我目前对Linux的了解,这似乎是一件很困难的事。
BTW:shell脚本是将很多的命令合成一个文件,在执行这个文件时,会依次执行文件中的每一条命令。这个跟DOS或Windows中的批处理是一个意思。