Linux基础及应用教程(基于CentOS7)
上QQ阅读APP看书,第一时间看更新

第2章 Linux操作基础

本章首先介绍Shell的相关概念、命令格式、通配符的使用方法,然后分别介绍了各类Linux常用命令的使用以及文本编辑器Vi的使用,最后介绍了Shell的重定向、管道、命令替换等功能以及Shell变量的定义与Shell环境的配置等。

2.1 Shell和命令基础

2.1.1 Shell简介

1.什么是Shell

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器),Shell接收用户输入的命令并把它送入内核执行,在用户与系统之间进行交互。Shell在Linux系统中具有极其重要的地位,如图2-1所示。

978-7-111-53793-9-Part01-55.jpg

图2-1 Shell在Linux系统中的地位

2.Shell的功能

命令解释器是Shell最重要的功能。Linux系统中的所有可执行文件都可以作为Shell命令来执行。将Linux的可执行文件进行分类,如表2-1所示。

2-1 Linux系统上可执行文件的分类

978-7-111-53793-9-Part01-56.jpg

图2-2描述了Shell是如何完成命令解释的。

978-7-111-53793-9-Part01-57.jpg

图2-2 命令解释过程

当用户提交了一个命令后,Shell首先判断是否为内置命令(由Shell自身负责解释),如果是就通过Shell的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或实用程序,就试图在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。在查找该命令时分为两种情况:

(1)用户给出了命令的路径,Shell就沿着用户给出的路径进行查找,若找到则调入内存,若没找到则输出提示信息。

(2)用户没有给出命令的路径,Shell就在环境变量PATH所制定的路径中依次进行查找,若找到则调入内存,若没找到则输出提示信息。

此外,Shell还具有如下功能。

●通配符、命令补全、别名机制、命令历史。

●重定向、管道、命令替换、Shell编程等。

3.Shell的主要版本

表2-2中列出了几种常见的Shell版本。RHEL/CentOS下默认的Shell是bash。

2-2 Shell的不同版本

978-7-111-53793-9-Part01-58.jpg

4.Shell的元字符

在Shell中有一些具有特殊的意义字符,称为Shell元字符(Shell Metacharacters)。若不以特殊方式指明,Shell并不会把它们当作普通文字符使用。

表2-3中简单介绍了常用的Shell元字符的含义。

2-3 常用的Shell元字符及含义

978-7-111-53793-9-Part01-59.jpg

2.1.2 命令格式和通配符

1.命令格式

Shell命令的一般格式为

978-7-111-53793-9-Part01-60.jpg

其中,cmd是命令名;options是选项;arguments是参数,即操作对象。

说明:

●最简单的Shell命令只有命令名,复杂的Shell命令可以有多个选项和参数。

●选项和参数都作为Shell命令执行时的输入,它们之间用空格分隔开。

●单字符参数前使用一个减号(-),单词参数前使用两个减号(--)。

●多个单字符参数前可以只使用一个减号。

●操作对象(arguments)可以是文件也可以是目录,有些命令必须使用多个操作对象如cp命令必须指定源操作对象和目标操作对象。

●并非所有命令的格式都遵从以上规则,如dd、find等。

例如:

978-7-111-53793-9-Part01-61.jpg

具有以上格式的字符串习惯地称为命令行,命令行是用户与Shell间对话的基本单位。 

2.目录和文件名的命名规则

在Linux下可以使用长文件或目录名,可以给目录和文件取任何名字,但必须遵循下列规则: 

●除了/之外,所有的字符都合法。 

●有些字符最好不用,如空格符、制表符、退格符和字符:?,@ # $ & () \ | ;‘ ’“ ”<>等。 

●避免使用+、–或.来作为普通文件名的第一个字符。 

●大小写敏感。 

●以.开头的文件或目录是隐含的。 

3.通配符 

通配符主要用于用户方便描述目录或文件。表2-4中是常用的通配符及其说明。 

2-4 常用的通配符

978-7-111-53793-9-Part01-62.jpg

提示

*能匹配文件或目录名中的.,但不能匹配首字符是.的文件或目录名。要匹配隐含文件应该使用.*。 

通配符在指定一系列的文件名时非常有用,表2-5中列举了一些使用通配符的例子。

2-5 通配符使用举例

978-7-111-53793-9-Part01-63.jpg

2.1.3 文件及Linux目录结构

1.什么是文件 

在Linux系统上,文件被看作是字节序列。这种概念使得所有的系统资源有了统一的标识,这些资源包括普通文件或目录、磁盘设备、控制台(键盘、显示器)、打印机等。对这些资源的访问和处理都是通过字节序列的方式实现的。Linux系统下的文件类型包括: 

●普通文件(-)。 

●目录(d)。 

●符号链接(l)。 

●字符设备文件(c)。

●块设备文件(b)。

●套接字(s)。

●命名管道(p)。

2.普通文件

普通文件就是字节序列,Linux并没有对其内容规定任何的结构。普通文件可以是程序源代码(C、C++、Python、Perl等)、可执行文件(文件编辑器、数据库系统、出版工具、绘图工具等)、图片、声音、图像等。Linux不会区别对待这些文件,只有处理这些文件的应用程序才会根据文件的内容为它们赋予相应的含义。

在DOS或Winodws环境中,所有的文件名后缀就能表示该文件的类型,如*.exe表示可执行文件,*.bat表示批处理文件。在Linux环境下,只要是可执行的文件并具有可执行属性则就能执行,不管其文件名后缀是什么。但是对一些数据文件一般也遵循一些文件名后缀规则,表2-6中列出了一些常用的文件后缀。

2-6 常用的文件后缀举例

978-7-111-53793-9-Part01-64.jpg

3.目录和硬链接

目录文件是由一组目录项组成,目录项可以是对其他文件的指向也可以是其下的子目录指向。

实际上,一个文件的名称是存储在其父目录中的,而并非同文件内容本身存储在一起。

将两个文件名(存储在其父目录的目录项中)指向硬盘上一个存储空间,对两个文件中的任何一个的内容进行修改都会影响到另一个文件,这种链接关系称为硬链接。硬链接文件实际上就是在某目录中创建目录项,从而使不止一个目录可以引用到同一个文件。它可以由ln命令建立。首先查看一下目录中的文件情况。

978-7-111-53793-9-Part01-65.jpg

使用ln命令建立文件file1的硬链接文件file2。

978-7-111-53793-9-Part01-66.jpg

该命令产生一个新的文件file2,和已经存在的文件file1建立起硬链接关系:

978-7-111-53793-9-Part01-67.jpg

可以看出,file2和file1的大小相同,内容相同。再看详细信息的第2列,原来file1的链接数是1,说明这一块硬盘存储空间只有file1一个文件指向它,而建立起file1和file2的硬链接关系之后,这块硬盘空间就有file1和file2两个文件同时指向它,所以file1和file2的链接数就都变为了2。因为两个文件指向一块硬盘空间,所以如果现在修改file2的内容为This is file2.,再查看file1的内容,就会有:

978-7-111-53793-9-Part01-68.jpg

如果删除其中的一个文件(不管是哪一个),就是删除了该文件和硬盘空间的指向关系,该硬盘空间不会释放,另外一个文件的内容也不会发生改变,但是目录详细信息中的链接数会减少,见如下信息。

978-7-111-53793-9-Part01-69.jpg

硬链接并不是一种特殊类型的文件,只是在同一个文件系统中允许多个目录项指向同一个文件的一种机制。

4.符号链接

符号链接又称软链接,是指将一个文件指向另外一个文件的文件名。这种符号链接的关系由ln-s命令行建立。首先查看一下目录中的文件信息。

978-7-111-53793-9-Part01-70.jpg

使用ln命令和-s选项建立文件file1的符号链接文件file2

978-7-111-53793-9-Part01-71.jpg

该命令产生一个新的文件file2,和已经存在的文件file1建立起符号链接关系

978-7-111-53793-9-Part01-72.jpg

可以看出file2这个文件很小,因为它只是记录了要指向的文件名而已,请注意从文件file2指向文件file1的指针。

为什么cat命令显示的file2的内容与file1相同呢?因为cat命令在寻找file2的内容时,发现file2是一个符号链接文件,根据file2记录的文件名找到了file1文件,然后将file1的内容显示出来。

明白了file1和file2的符号链接关系,就可以理解为什么file1的链接数仍然为1,这是因为file1指向的硬盘空间仍然只有file1一个文件在指向。

如果现在删除了file2,对file1并不产生任何影响;而如果删除了file1,那么file2就因无法找到文件名称为file1的文件而成为死链接。

978-7-111-53793-9-Part01-73.jpg

5.设备文件

设备是指计算机中的外围硬件装置,即除了CPU和内存以外的所有设备。通常,设备中含有数据寄存器或数据缓存器、设备控制器,用于完成设备同CPU或内存的数据交换。

在Linux下,为了屏蔽用户对设备访问的复杂性,采用了设备文件,即可以通过像访问普通文件一样的方式对设备进行读写访问。

设备文件用来访问硬件设备,包括硬盘、光驱、打印机等。每个硬件设备至少与一个设备文件相关联。设备文件分为字符设备(如键盘)和块设备(如磁盘)。Linux下设备名以文件系统中的设备文件的形式存在。所有的设备文件存放在/dev目录下。

下面对常用设备列表说明,如表2-7所示。

2-7 常用设备文件说明

978-7-111-53793-9-Part01-74.jpg

在/dev目录下有许多链接文件,使用这些链接能够方便地使用系统中的设备。例如,可以通过/dev/cdrom而不是/dev/sr0来访问光驱。

6.套接字和命名管道

套接字和命名管道是Linux环境下实现进程间通信(IPC)的机制。

命名管道(FIFO)文件允许运行在同一台计算机上的两个进程之间进行通信。套接字socket)允许运行在不同计算机上的进程之间相互通信。

套接字和命名管道通常是在进程运行时创建或删除的,一般无需系统管理员干预。

7.熟悉Linux的目录结构

Linux的目录结构遵从文件系统层次结构标准(File system Hierarchy Standard,FHS)。表2-8中解释了由FHS所规定的存放特定类型的文件位置。

2-8FHS所规定的Linux文件系统布局

978-7-111-53793-9-Part01-75.jpg

提示

1.在Linux环境下,文件是归类存放的。初学Linux的朋友应该熟悉特定类型的文件的存放位置。

2.对于Linux的初学者而言,在不知道自己究竟在做什么的情况下,不要轻易操作系统目录,如/proc、/boot、/etc、/usr、/var等。

3.用户可以使用如下命令获得Linux文件层次结构的说明:

$ man hier

2.2 Linux常用操作命令

2.2.1 文件目录操作命令

1.常用的文件目录操作命令

表2-9中列出了一些常用的文件目录操作命令。

2-9 常用的文件目录操作命令

978-7-111-53793-9-Part01-76.jpg

2.文件目录命令操作举例

表2-10中列出了一些常用的文件目录操作命令的使用举例

2-10 常用的文件目录操作命令使用举例

978-7-111-53793-9-Part01-77.jpg

978-7-111-53793-9-Part01-78.jpg

提示

GNU/Linux的文件有如下3种类型的时间戳。

●mtime:最后修改时间(Is-lt)。

●ctime:状态改变时间(Is-lc)。

●atime:最后访问时间(Is-lu)。

说明:

(1)ctime并非文件创建时间。

(2)覆盖一个文件会改变所有3类时间:mtime、ctlme和atime。

(3)改变文件的访问权限或拥有者会改变文件的ctime和atime。

(4)读文件会改变文件的atlme。

2.2.2 文本文件操作命令

1.常用的文本文件操作命令

表2-11中列出了一些常用的文本文件操作命令。

2-11 常用的文本文件操作命令

978-7-111-53793-9-Part01-79.jpg

2.正则表达式

在许多文本处理工具(如grep、sed、awk、vi等)中都可以使用正则表达式。正则表达式是使用某种模式(pattern)来匹配(matching)一类字符串的一个公式。通常使用正则表达式进行查找、替换等操作。虽然复杂的正则表达式对于初学者来说晦涩难懂,但对于Linux使用者来说,学会使用正则表达式是非常必要的。在适当的情况下使用正则表达式可以极大地提高工作效率。POSIX风格的正则表达式有两种:基本的正则表达式(Basic Regular Expression,BRE)和扩展的正则表达式(Extended Regular Expression,ERE)。

正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母、数字(即所有非元字符),而元字符则具有特殊的含义。表2-12和表2-13中列出了POSIX RE的元字符及其含义。

2-12 POSIX RE用于方括号之外的元字符

978-7-111-53793-9-Part01-80.jpg

2-13 POSIX RE用于方括号之内的元字符

978-7-111-53793-9-Part01-81.jpg

3.常用的文本文件操作命令举例

表2-14中列出了一些常用的文件目录操作命令的使用举例

2-14 常用的文件目录操作命令使用举例

978-7-111-53793-9-Part01-82.jpg

(续)

978-7-111-53793-9-Part01-83.jpg

注意

上述例子中的sed命令仅将处理结果显示在屏幕上而未修改源文件的内容。若希望修改源文件的内容,可在sed命令后使用-i参数。

2.2.3 打包和压缩命令

1.常用的打包(归档)和压缩命令

用户经常需要把一组文件存储成一个文件以便备份或传输到另一个目录甚至另一台计算机。有时还需要把文件压缩成一个文件,使得其占用少量的磁盘空间并能更快地通过互联网传输。表2-15中列出了一些常用的打包和压缩命令。

表2-15 与打包和压缩相关的常用命令

978-7-111-53793-9-Part01-84.jpg

提示

正确使用zcat/zmore/zless/zgrep、bzcat/bzmore/bzless/bzgrep、xzcatjxzmore/ xzless/xzgrep命令的前提是压缩前的文件是纯文本文件。

2.常用的打包和压缩命令操作举例

表2-16中列出了一些常用的压缩命令操作举例。

表2-16 常用的压缩命令操作举例

978-7-111-53793-9-Part01-85.jpg

(续)

978-7-111-53793-9-Part01-86.jpg

在Linux环境下,通常使用GNU的tar命令调用各个压缩软件实现打包压缩和解压缩。表2-17中列出了tar命令和压缩命令的操作举例。

表2-17 tar打包与压缩命令操作举例

978-7-111-53793-9-Part01-87.jpg

2.2.4 信息显示命令

1.常用的信息显示命令

表2-18中列出了一些常用的信息显示命令。

表2-18 常用的信息显示命令

978-7-111-53793-9-Part01-88.jpg

(续)

978-7-111-53793-9-Part01-89.jpg

2.常用的信息显示命令操作举例

表2-19中列出了一些常用的信息显示命令的操作举例。大多数的信息显示命令无须使用任何参数,表2-19中仅举例说明需要带参数的命令。

表2-19 常用的信息显示命令操作举例

978-7-111-53793-9-Part01-90.jpg

2.2.5 文本编辑器Ⅵ

1.Ⅵ的简介

Ⅵ是Visual interface的简称,可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的功能。

Vi不是一个排版程序,不像MS Word或WPS那样可以对字体、格式、段落等其他属性进行编排,它只是一个文本编辑程序。

2.进入Ⅵ

表2-20中列出了进入Vi文本编辑器的方式及说明。

2-20 进入Vi文本编辑器的方式

978-7-111-53793-9-Part01-91.jpg

3.Vi的3种运行模式

Vi有3种基本工作模式:普通(normal)模式、插入(insert)模式和命令行(command-line或Cmdline)模式,如图2-3所示。

进入Vi之后,首先进入的就是普通模式。进入普通模式后Vi等待编辑命令输入而不是文本输入,也就是说这时输入的字母都将作为命令来解释。在普通(normal)模式里,可以输入所有的普通编辑命令。普通模式亦称为命令(command)模式。

978-7-111-53793-9-Part01-92.jpg

图2-3 Vi的3种模式之间的转换示意图

进入普通模式后光标停在屏幕第一行首位上用_表示),其余各行的行首均有一个“~”符号,表示该行为空行。最后一行是状态行,显示出当前正在编辑的文件名及其状态。如果是[New File],则表示该文件是一个新建的文件。如果输入Vi之后带有文件名参数,文件已在系统中存在,则在屏幕上显示出该文件的内容,并且光标停在第一行的首位,在状态行显示出该文件的文件名、行数和字符数。

在普通模式下输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入插入模式。在插入模式下,用户输入的任何字符都被Vi当作文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令行模式下,按〈Esc〉键即可。

在普通模式下,执行ex命令使用“:”,查找使用“?”和“/”,调用Shell命令使用“!”。多数文件管理命令都是在此模式下执行的。末行命令执行完后,Vi自动回到普通模式。

若在命令行模式下输入命令过程中改变了主意,可用〈Back space〉键将输入的命令全部删除,之后再按一下〈Back space〉键,即可使Vi回到普通模式。关于这3个模式的转换如图2-3所示。

4.普通模式下的操作

表2-21至表2-27中列出了普通模式下的几类命令。

2-21 普通模式下进入插入模式

978-7-111-53793-9-Part01-93.jpg

2-22 普通模式下的光标定位

978-7-111-53793-9-Part01-94.jpg

2-23 普通模式下的替换和删除

978-7-111-53793-9-Part01-95.jpg

2-24 普通模式下的复制和粘贴

978-7-111-53793-9-Part01-96.jpg

2-25 普通模式下的字符串搜索

978-7-111-53793-9-Part01-97.jpg

2-26 普通模式下的撤销和重复

978-7-111-53793-9-Part01-98.jpg

2-27 在普通模式下退出Vi

978-7-111-53793-9-Part01-99.jpg

5.命令模式下的操作

表2-28至表2-34中列出了在命令模式下的常用命令

2-28 在命令模式下跳行

978-7-111-53793-9-Part01-100.jpg

2-29 在命令模式下搜索和替换字符串

978-7-111-53793-9-Part01-101.jpg

2-30 在命令模式下复制、移动和删除文件行(块

978-7-111-53793-9-Part01-102.jpg

2-31 在命令模式下的文件相关命令

978-7-111-53793-9-Part01-103.jpg

2-32 在命令模式下执行Shell命令

978-7-111-53793-9-Part01-104.jpg

2-33 在命令模式下设置Vi环境

978-7-111-53793-9-Part01-105.jpg

2-34 在命令模式下退出Vi

978-7-111-53793-9-Part01-106.jpg

2.3 使用Shell

2.3.1 Shell变量和Shell环境

1.Shell 变量的分类

Shell 变量大致可以分为以下3类。

●内部变量:由系统提供,用户只能使用不能修改。

●环境变量:这些变量决定了用户工作的环境,不需要用户定义,可以直接在Shell中使

用,其中某些变量用户可以修改。

●用户变量:由用户建立和修改,也称用户自定义变量。在Shell脚本编写中会经常用到。

2.Shell变量的定义和输出

Shell支持具有字符串值的变量。Shell变量不需要专门的定义和初始化语句。一个没有初始化的Shell变量被认为是空字符串。通常通过赋值语句完成变量说明并予以赋值,并且可以给一个变量多次赋值以改变其值。

在Shell中,变量的赋值使用如下语法格式。

978-7-111-53793-9-Part01-107.jpg

其中:

●name是变量名,变量名是以字母或下画线开头的字母、数字和下画线字符序列。用户

自定义变量按照惯例使用小写字母命名。

●“=”是赋值符号。两边不能直接跟空格,否则Shell将视为命令。

●string是被赋予的变量值。若string中包含空格、制表符和换行符,则string必须用

'string'或"string"的形式,即用单(双)引号将其括起来。双引号内允许变量替换,而

单引号则不可以。

通过在变量名(name)前加$字符,即用$name的形式引用变量的值,引用的结果就是用字符串string代替$name。此过程也称为变量替换。在字符串连接过程中为了界定变量名、避免混淆,变量替换也可以使用${name}的形式。

变量输出可使用Shell的内置命令echo(常用)或printf(用于格式化输出,类似C语言的printf())。

下面给出一个定义和使用Shell变量的例子。

操作步骤2.1 定义和使用Shell变量举例

978-7-111-53793-9-Part01-108.jpg

978-7-111-53793-9-Part01-109.jpg

3.Shell变量的作用域

Shell变量有其规定的作用范围。Shell变量分为局部变量和全局变量。所有自定义变量默认都是局部变量;环境变量是全局变量。

●局部变量的作用范围仅限制在其命令行所在的Shell或当前Shell脚本执行过程中。

● 全局变量的作用范围则包括定义该变量的Shell及其所有子Shell。

可以使用export内置命令将局部变量设置为全局变量。export的常用格式为:

978-7-111-53793-9-Part01-110.jpg

下面给出一个Shell变量作用域的例子

操作步骤2.2 Shell变量作用域举例

978-7-111-53793-9-Part01-111.jpg

978-7-111-53793-9-Part01-112.jpg

重点

(1)在当前Shell中要想使用父辈Shell中的变量,至少要在当前Shell的父Shell中设置为全局变量。

(2)变量在子Shell中值的修改不会传回父Shell。C

4.Shell环境变量

环境变量定义Shell的运行环境,保证Shell命令的正确执行。Shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。所有环境变量都是全局变量(即可以传递给子Shell),并可以由用户重新设置。表2-35中列出了一些系统中常用的环境变量。

2-35 Shell中的环境变量

978-7-111-53793-9-Part01-113.jpg

这些变量都是可写的,用户可以为它们赋任何值。如要使用自己的环境变量,则应该使用前面介绍的export命令。提示

1.用户还可以使用不带任何参数的env、printenv或export命令,显示当前定义的所有环境变量。

2.要取消一个环境变量的声明或赋值,也可以使用unset命令。

5.设置用户工作环境

用户登录系统时,Shell为用户自动定义唯一的工作环境,并对该环境进行维护直至用户注销。该环境将定义如身份、工作场所和正在运行的进程等特性。这些特性由指定的环境变量值定义。

Shell环境与办公环境相似,在办公室中每个人所处环境的物理特性,如灯光和温度,但在办公环境中又有许多因素是个人特有的,如日常工作和个人工作空间,因此用户自己的工作环境就有别于其他用户的工作环境。正如一个用户的Shell环境不同于其他用户的Shell环境。

用户工作环境还有登录环境和非登录环境之分。登录环境是指用户登录系统时的工作环境,此时的Shell对登录用户而言是主Shell。非登录环境是指用户在调用子Shell时所使用的用户环境。

用户并不需要每次登录后都对各种环境变量进行手工设置,通过环境设置文件,用户的工作环境的设置可以在登录的时候自动由系统来完成。环境设置文件有两种,一种是系统环境设置文件,另一种是个人环境设置文件。

(1)系统中的用户工作环境设置文件(对所有用户均生效)

●登录环境设置文件:/etc/profile。

●非登录环境设置文件:/etc/bashrc。

(2)用户设置的环境设置文件(只对用户自身生效)

●登录环境设置文件:$HOME/.bash_profile。

●非登录环境设置文件:$HOME/.bashrc。提示

1.工作环境设置文件是Shell脚本文件。

2.用户可以修改自己的用户环境设置文件,来覆盖在系统环境设置文件中的全局设置。例如

(1)用户可以将自定义的环境变量存放在$HOME/.bash_profile中。

(2)用户可以将自定义的别名存放在$HOME/.bashrc中,以便在每次登录和调用子Shell时生效。

2.3.2 几种提高工作效率的方法

1.自动补全命令行

为了减少键盘输入次数,bash提供了命令行自动补全功能,随时按下〈Tab〉键,bash就能判断出用户所要自动补全的对象。可以自动补全的对象是:

●命令名(包括命令别名、Shell函数名)。

●Shell变量(bash将以$开头的补全对象视为Shell变量)。

●用户名(bash将以~开头的补全对象视为用户名,并解析为用户的家目录)。

●主机名(bash将以@开头的补全对象视为主机名,并从/etc/hosts中查找补全对象)。

下面给出一些命令行补全的例子。

操作步骤2.3 命令行补全的例子

978-7-111-53793-9-Part01-114.jpg

2.命令历史

bash可以记录一定数目的以前在Shell中输入的命令。可以记录历史命令的数目由环境变量HISTSIZE的值指定。记录历史命令的文本文件由环境变量HISTFILE来指定,默认的记录文件是.bash_history,这是一个隐含文件,位于用户的宿主目录下。

仅将先前的命令存在历史文件里是没有用的,将历史命令记录后,用户如何使用它们呢?有如下几种方式:

●最简单的方法是用上下方向键、〈PgUp〉和〈PgDn〉键来查看历史命令。

●如果需要,可以使用键盘上的编辑功能键对显示在命令行上的命令进行编辑。

●用history命令来显示和编辑历史命令。

●用!<命令事件号>执行已经运行过的命令。

●用!<已经使用过的命令前面的部分>执行已经运行过的命令。

下面给出一个使用命令历史操作的例子。

操作步骤2.4 使用命令历史的例子

978-7-111-53793-9-Part01-115.jpg

3.命令别名

命令别名是bash提供的另一个使用户的工作变得轻松的方法。命令别名通常是其他命令的缩写,用来减少键盘输入。同时也允许用户为命令另外取一个自己习惯使用的名字。

可以使用alias命令来达到上述目的。命令格式为:

978-7-111-53793-9-Part01-116.jpg

其中alias_name是用户给命令取的别名,original_command是原来的命令和参数。不使用任何参数来使用alias命令,将显示当前的别名和其对应的原始命令。下面给出几个使用命令别名操作的例子。操作步骤2.5使用命令别名的例子

978-7-111-53793-9-Part01-117.jpg

注意

1.在定义别名时,等号两边不允许有空格存在,否则bash将不能确定用户的意图。若命令中包含空格或其他的特殊字符串则必须使用引号。

2.若系统中有一个命令,同时又定义了一个与之同名的别名(例如,系统中有ls命令,且又定义了ls的别名),则别名将优先于系统中原有命令的执行。要想临时使用系统中的命令而非别名,应该在命令前添加转义符“\”,例如,\ls命令将运行系统中原来的ls命令而不是ls别名,它不区分文件类型和颜色。

3.如果用户需要别名的定义在每次登录时均有效,应该将其写入用户私有目录下的.bashrc文件中。

2.3.3 进一步使用Shell

1.重定向

Linux命令在执行时常常期望接收输入数据,命令执行后又期望将产生的数据结果输出Linux的大部分命令都具有标准的输入/输出设备端口。表2-36中列出了标准设备。

2-36 标准设备

978-7-111-53793-9-Part01-118.jpg

所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输出重定向、输入重定向和错误重定向。通常情况下重定向到一个文件。在Shell中,要实现重定向主要依靠重定向符实现,即Shell是检查命令行中有无重定向符来决定是否需要实施重定向。表2-37中列出了常用的重定向符。

2-37 重定向符

978-7-111-53793-9-Part01-119.jpg

下面给出几个使用重定向操作的例子

操作步骤2.6 使用重定向的例子

978-7-111-53793-9-Part01-120.jpg

2.管道

许多Linux命令具有过滤特性,即一条命令通过标准输入端口接收一个文件中的数据,命令执行后产生的结果数据又通过标准输出端口送给后一条命令,作为该命令的输入数据。后一条命令也是通过标准输入端口而接收输入数据。

Shell提供管道命令“|”将这些命令前后衔接在一起,形成一个管道线,格式为

978-7-111-53793-9-Part01-121.jpg

管道线中的每一条命令都作为一个单独的进程运行,每一条命令的输出作为下一条命令的输入。由于管道线中的命令总是从左到右顺序执行的,因此管道线是单向的。

管道线的实现创建了Linux系统管道文件并进行重定向,但是管道不同于I/O重定向,输入重定向导致一个程序的标准输入来自某个文件,输出重定向是将一个程序的标准输出写到一个文件中,而管道是直接将一个程序的标准输出与另一个程序的标准输入相连接,不需要经过任何中间文件。下面给出几个使用管道的例子。 操作步骤2.7 使用管道的例子

978-7-111-53793-9-Part01-122.jpg

978-7-111-53793-9-Part01-123.jpg

3.命令替换

Shell中的命令参数可以由另一个命令执行的结果来替代。使用的格式如下

978-7-111-53793-9-Part01-124.jpg

其中,cmd2 arguments的输出作为cmd1的参数注意

cmd2要放在反引号“`”里。请注意反引号“`”和单引号“’”的区别,它们在功能上并不相同。

下面给出几个使用命令替换的例子

操作步骤2.8 使用命令替换的例子

978-7-111-53793-9-Part01-125.jpg

4.命令组合

除了可以使用管道连接若干命令之外,还可以在一个命令行上使用若干Shell的元字符将若干命令组合在一起,表2-38中列出了这些命令组合的方法及其说明。

2-38 命令组合

978-7-111-53793-9-Part01-126.jpg

下面给出几个使用命令组合的例子操作步骤2.9 使用命令组合的例子

978-7-111-53793-9-Part01-127.jpg

注意

当Here文件的内容包含变量替换和命令替换时,必须对$使用转移符\$,否则会将变量替换和命令替换的结果存入输出重定向的文件。行尾的续行符\,也应该使用转义的\\,在使用Here文件形式生成Shell脚本时特别有用。

2.4 思考与实验

1.思考

1)什么是Shell?具有什么功能?Linux默认使用什么Shell?

2)简述文件的类型。硬链接和软链接有何区别?

3)简述Linux的标准目录结构及其存放内容。

4)Linux的基本命令格式如何?Linux下经常使用的通配符有哪些

5)在Linux下如何使用设备?常用的设备名有哪些?

6)常用的文件和目录操作命令有哪些?各自的功能是什么

7)常用的信息显示命令有哪些?各自的功能是什么?

8)打包和压缩有何不同?常用的打包和压缩命令有哪些?

9)简述在Shell中可以使用哪几种方法提高工作效率。

10)Linux下的隐含文件如何标识?如何显示?

11)Linux下经常使用-f和-r参数,它们的含义是什么?

12)Vi的3种运行模式是什么?如何切换?

13)什么是重定向?什么是管道?什么是命令替换?

14)Shell变量有哪两种?分别如何定义?

15)如何设置用户自己的工作环境?

16)比较下面命令的含义。

978-7-111-53793-9-Part01-128.jpg

17)比较下面的特殊字符和操作热键的含义

978-7-111-53793-9-Part01-129.jpg

2.实验

(1)浏览并熟悉Linux目录结构。

(2)学会使用命令帮助。

(3)熟悉各种常用命令的使用。

(4)熟悉文本编辑器Vi的使用。

(5)熟悉并使用Shell的命令补全、命令历史、命令别名。

(6)熟悉并使用Shell的重定向、管道、命令替换、命令组合。

(7)学会定义和输出Shell变量。

(8)学会设置用户自己的工作环境。

3.进一步学习

(1)学习使用Vundle(https://github.com/VundleVim/Vundle.vim)管理vim插件

(2)学习使用tmux和/或screen。