1.什么是Shell
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器),Shell接收用户输入的命令并把它送入内核执行,在用户与系统之间进行交互。Shell在Linux系统中具有极其重要的地位,如图2-1所示。
图2-1 Shell在Linux系统中的地位
2.Shell的功能
命令解释器是Shell最重要的功能。Linux系统中的所有可执行文件都可以作为Shell命令来执行。将Linux的可执行文件进行分类,如表2-1所示。
表2-1 Linux系统上可执行文件的分类
图2-2描述了Shell是如何完成命令解释的。
图2-2 命令解释过程
当用户提交了一个命令后,Shell首先判断是否为内置命令(由Shell自身负责解释),如果是就通过Shell的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或实用程序,就试图在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。在查找该命令时分为两种情况:
(1)用户给出了命令的路径,Shell就沿着用户给出的路径进行查找,若找到则调入内存,若没找到则输出提示信息。
(2)用户没有给出命令的路径,Shell就在环境变量PATH所制定的路径中依次进行查找,若找到则调入内存,若没找到则输出提示信息。
此外,Shell还具有如下功能。
●通配符、命令补全、别名机制、命令历史等。
●重定向、管道、命令替换、Shell编程等。
3.Shell的主要版本
表2-2中列出了几种常见的Shell版本。RHEL/CentOS下默认的Shell是bash。
表2-2 Shell的不同版本
4.Shell的元字符
在Shell中有一些具有特殊意义的字符,称为Shell元字符(Shell Metacharacters)。若不以特殊方式指明,Shell并不会把它们当作普通文字符使用。
表2-3中简单介绍了常用的Shell元字符及含义。
表2-3 常用的Shell元字符及含义
1.命令格式
Shell命令的一般格式为:
其中,cmd是命令名;options是选项;arguments是参数,即操作对象。
说明:
●最简单的Shell命令只有命令名,复杂的Shell命令可以有多个选项和参数。
●选项和参数都作为Shell命令执行时的输入,它们之间用空格分隔开。
●单字符参数前使用一个减号(-),单词参数前使用两个减号(--)。
●多个单字符参数前可以只使用一个减号。
●操作对象(arguments)可以是文件也可以是目录,有些命令必须使用多个操作对象,如cp命令必须指定源操作对象和目标操作对象。
●并非所有命令的格式都遵从以上规则,如dd、find等。
例如:
具有以上格式的字符串习惯地称为命令行,命令行是用户与Shell间对话的基本单位。
2.目录和文件名的命名规则
在Linux下可以使用长文件或目录名,可以给目录和文件取任何名字,但必须遵循下列规则:
●除了/之外,所有的字符都合法。
●有些字符最好不用,如空格符、制表符、退格符和字符:?,@ # $ &()\|;‘ ’“”<>等。
●避免使用+、-或.来作为普通文件名的第一个字符。
●大小写敏感。
●以.开头的文件或目录是隐含的。
3.通配符
通配符主要用于用户方便描述目录或文件。表2-4中是常用的通配符及其说明。
表2-4 常用的通配符
提示
*能匹配文件或目录名中的.,但不能匹配首字符是.的文件或目录名。要匹配隐含文件应该使用.*。
通配符在指定一系列的文件名时非常有用,表2-5中列举了一些使用通配符的例子。
表2-5 通配符使用举例
1.什么是文件
在Linux系统上,文件被看作是字节序列。这种概念使得所有的系统资源有了统一的标识,这些资源包括普通文件或目录、磁盘设备、控制台(键盘、显示器)、打印机等。对这些资源的访问和处理都是通过字节序列的方式实现的。Linux系统下的文件类型包括:
●普通文件(-)。
●目录(d)。
●符号链接(l)。
●字符设备文件(c)。
●块设备文件(b)。
●套接字(s)。
●命名管道(p)。
2.普通文件
普通文件就是字节序列,Linux并没有对其内容规定任何的结构。普通文件可以是程序源代码(如C、C++、Python、Perl等)、可执行文件(如文件编辑器、数据库系统、出版工具、绘图工具等)、图片、声音、图像等。Linux不会区别对待这些文件,只有处理这些文件的应用程序才会根据文件的内容为它们赋予相应的含义。
在DOS或Windows环境中,所有的文件扩展名就能表示该文件的类型,如*.exe表示可执行文件,*.bat表示批处理文件。在Linux环境下,只要是可执行的文件并具有可执行属性就能执行,无论其文件名后缀是什么。但是对一些数据文件一般也遵循一些文件名后缀规则,表2-6中列出了一些常用的文件后缀。
表2-6 常用的文件后缀举例
3.目录和硬链接
目录文件是由一组目录项组成,目录项可以是对其他文件的指向,也可以是其下的子目录指向。
实际上,一个文件的名称是存储在其父目录中的,而并非同文件内容本身存储在一起。
将两个文件名(存储在其父目录的目录项中)指向硬盘上一个存储空间,对两个文件中的任何一个的内容进行修改都会影响到另一个文件,这种链接关系称为硬链接。硬链接文件实际上就是在某目录中创建目录项,从而使不止一个目录可以引用到同一个文件。它可以由ln命令建立。首先查看目录中的文件情况。
使用ln命令建立文件file1的硬链接文件file2。
该命令产生一个新的文件file2,和已经存在的文件file1建立起硬链接关系:
可以看出,file2和file1的大小相同、内容相同、再看详细信息的第2列,原来file1的链接数是1,说明这一块硬盘存储空间只有file1一个文件指向它,而建立起file1和file2的硬链接关系之后,这块硬盘空间就有file1和file2两个文件同时指向它,所以file1和file2的链接数就都变为了2。因为两个文件指向一块硬盘空间,所以如果现在修改file2的内容为This is file2.,再查看file1的内容,就会有:
如果删除其中的一个文件(无论是哪一个),就是删除了该文件和硬盘空间的指向关系,该硬盘空间不会释放,另外一个文件的内容也不会发生改变,但是目录详细信息中的链接数会减少,见如下信息。
硬链接并不是一种特殊类型的文件,只是在同一个文件系统中允许多个目录项指向同一个文件的一种机制。
4.符号链接
符号链接又称软链接,是指将一个文件指向另外一个文件的文件名。这种符号链接的关系由ln-s命令行建立。首先查看目录中的文件信息。
使用ln命令和-s选项建立文件file1的符号链接文件file2。
该命令产生一个新的文件file2,和已经存在的文件file1建立起符号链接关系。
可以看出file2这个文件很小,因为它只是记录了要指向的文件名而已,请注意从文件file2指向文件file1的指针。
为什么cat命令显示的file2的内容与file1相同呢?因为cat命令在寻找file2的内容时,发现file2是一个符号链接文件,根据file2记录的文件名找到了file1文件,然后将file1的内容显示出来。
明白了file1和file2的符号链接关系,就可以理解为什么file1的链接数仍然为1,这是因为file1指向的硬盘空间仍然只有file1一个文件在指向。
如果现在删除了file2,对file1并不产生任何影响;而如果删除了file1,那么file2就因无法找到文件名称为file1的文件而成为死链接。
5.设备文件
设备是指计算机中的外围硬件装置,即除了CPU和内存以外的所有设备。通常,设备中含有数据寄存器或数据缓存器、设备控制器,用于完成设备同CPU或内存的数据交换。
在Linux下,为了屏蔽用户对设备访问的复杂性,采用了设备文件,即可以通过像访问普通文件一样的方式对设备进行读写访问。
设备文件用来访问硬件设备,包括硬盘、光驱、打印机等。每个硬件设备至少与一个设备文件相关联。设备文件分为字符设备(如键盘)和块设备(如磁盘)。Linux下设备名以文件系统中的设备文件的形式存在。所有的设备文件存放在/dev目录下。
下面对常用设备文件说明,如表2-7所示。
表2-7 常用设备文件说明
在/dev目录下有许多链接文件,使用这些链接能够方便地使用系统中的设备。例如,可以通过/dev/cdrom而不是/dev/sr0来访问光驱。
6.套接字和命名管道
套接字和命名管道是Linux环境下实现进程间通信(IPC)的机制。
命名管道(FIFO)文件允许运行在同一台计算机上的两个进程之间进行通信。套接字(Socket)允许运行在不同计算机上的进程之间相互通信。
套接字和命名管道通常是在进程运行时创建或删除的,一般无需系统管理员干预。
7.熟悉Linux的目录结构
Linux的目录结构遵从文件系统层次结构标准(File system Hierarchy Standard,FHS)。表2-8中解释了由FHS所规定的存放特定类型的文件位置。
表2-8 由FHS所规定的Linux文件系统布局
提示
1.在Linux环境下,文件是归类存放的。初学Linux的朋友应该熟悉特定类型的文件的存放位置。
2.对于Linux的初学者而言,在不知道自己究竟在做什么的情况下,不要轻易操作系统目录,如/proc、/boot、/etc、/usr、/var等。
3.用户可以使用如下命令获得Linux文件层次结构的说明: