UNIX/Linux应用、编程与系统管理(第3版)

UNIX/Linux应用、编程与系统管理(第3版)"

作者:[美]SumitabhaDas著贾洪峰李莉译
ISBN:9787302355847
定价:¥99
字数:千字
页数:
出版时间:2014.04.01
开本:
版次:1-1
装帧:
出版社:清华大学出版社
简介

UNIX是计算机发展历史上最成功的操作系统家族。它诞生于贝尔实验室,尔后迅速成为世界上操作系统的主流并延续至今。Linux派生于UNIX,并且在小型机和桌面计算机领域成为和微软的Windows并驾齐驱的操作系统家族。

  《UNIX/Linux应用、编程与系统管理(第3版)》兼顾用户和程序员的思路来编写,是终极的UNIX/Linux教材。本书既有教学工具又有详尽的参考资料,非常适合于任何UNIX或Linux相关课程。与类似教材不同的是,本书设置了一个强大的教学框架,能够使入门级的学生牢固地掌握基本概念,而高级主题章节能激发更有经验的读者超越基础知识。书中提供了近千道练习和自测题,用于让学生测试和巩固他们对知识的理解。

前言

前    言

一门不能改变思维方式的语言是不值得掌握的。

—Larry Wall(Perl的发明者),Randal Schwartz

早在开始讲授本课程之前,我就决定写一本关于UNIX的书。我对当时市面上的相关书籍都不满意,也几乎没有任何专家可以寻求帮助。在费尽千辛万苦学完本课程之后,我决定写本书,向大家介绍自己的经验,但当时并没有想清楚它应当面向什么样的读者对象。多年之后,在我开始讲授这门课程时却发现,学生们提出的一些问题都已经在我的书中做了解答。这时,我才知道自己做对了,这实际上是一本教科书。

UNIX经受住了时间的考验,而且在今后一段时间内应当仍然如此。但在说起UNIX时,还是有很多人会说它“不够友好”、“让人挠头”。初学者还是会因为它显而易见的复杂性而备感打击。即便是经验丰富的计算机专业人士,也很难再乐于接受它的工作方式,不愿意触碰它的命令行、无数的选项和复杂的语法。今天的所有UNIX和Linux系统都提供了图形用户界面,但命令行仍然是UNIX系统的主干。

UNIX令人激动之处在于它的许多功能都是隐藏的。UNIX并没有把一切都摆在明面上;它鼓励用户去创造、去革新。对于UNIX爱好者来说,如何找出能够完成一项复杂任务的命令组合或脚本,都是真正的挑战。这就是UNIX,而且它最好继续保持这种风格。如果你欣赏这样一句话——“任何疯狂背后皆有章法可循”,那你也就上道了,这本书就是为你准备的。

与众不同

我最早接触的计算机就是UNIX机,在UNIX系统中摸爬滚打很长一段时间后,我认识到,妨碍理解UNIX的绊脚石并不是人们认为的那些。UNIX之所以不容易理解,并不是因为它太难了,而是因为作者们缺乏足够的想象力,没有为它换一种表现方式。例如,书中经常会给出一条命令的20个选项,而其中可能只有一两项是真正有用的。我在饱受挫折之后,决定自行编写一本“真正”的UNIX书籍——一本知道用户真正需要什么的UNIX书籍,一本用户愿意随身携带的UNIX书籍。

现实示例  UNIX的概念很简单,但也很抽象,为什么要采用某一特定方式来处理某一特定功能,其原因往往不是那么明显。要掌握这一操作系统,就需要全面理解这些概念。我确信已经足够清晰地解释了它的关键特性,既揭示了在设计时的考虑因素,也揭示了它们与现实世界的相关性。你会发现,本书中的许多例子都源于现实生活中的情景。

用户指南与程序员指南  UNIX用户主要有两类,一类用户使用UNIX的原生工具;另一类用户则使用shell脚本和UNIX系统调用库来开发工具。本书足够详细地讨论了这两方面的内容,又使篇幅保持在便于阅读、携带的范围内(在同类书籍中,可能只有本书能做到这一点)。

前11章为“用户”服务,对于导论性的UNIX课程来说,这些内容就足够了。“开发人员”是shell或系统程序员,他们还得知道工作机理,例如在创建或链接一个文件时,目录会受到什么样的影响。为他们着想,前面几章包括了一些用于探究关键概念的特殊加框文字。这种安排应当不会对初学者造成影响,他们可以悄悄地忽略这些部分。第16~18章体现了UNIX的精华,要求系统程序员必须阅读这些章节。

醒目的学习提示  教学提示是本书的一个突出特征。它们有各种不同的名称,例如“注意”、“警告”和“提示”。我认为Linux是UNIX家庭中的一个重要成员,所以特别采用企鹅标记来突出显示Linux特性。

许多作者都是在单独一章中讨论每种shell,我不太赞同这种做法。我主要使用Bash shell来讨论关键概念,然后再分别讨论C shell、Korn shell、Bourne shell的不同之处。

大量习题与练习  本书给出了大量问题,用来测验读者掌握的知识。其中有超过1/3是自测问题,其答案在附录I中给出。这些问题都是面向初学者的,在继续学习下一章之前,应当首先出色地回答这些问题。

难度更大、范围更广的问题留在“习题”部分。其中有一部分的难度很大,可能需要花费一些时间进行求解。这些习题会巩固(往往还会丰富)你的UNIX知识,所以不要忽视它们。这些问题的答案在本书网站上提供:http://www.mhhe.com/das。

新增内容

一些评论者似乎对本书第2版非常满意,他们警告说,再做改进可能不会有“太大收效”。我在牢记这一点的同时,在这一版中进行了以下修改:

● vi/vim一章得以保留,而emacs一章则被压缩,转为附录。为使初学者更轻松地过渡到vi,第3章介绍了pico编辑器。

● bc计算器实用程序在这一版中又回归了,但只是作为shell程序员的一个高效计算工具。

● 专门为讨论C语言程序设计的基础知识而增加了一章。尽管有些简略,但有了这一章,就足以理解后面两章的系统程序设计内容了。

● 现在的第15章包括了流行的并发版本系统(CVS),所有Linux系统中都可以找到它。SCCS和RCS在这一版中继续保有一席之地,但在下一版,至少会删除它们中的一项。

● 由于GNU调试程序(gdb)优于dbx,所以这一版中已经将gdb收纳在内,不过后者依然得以保留。

这些变化使本书的篇幅稍有增加。尽管增加了对Linux和GNU工具的介绍,但本书的通用特性仍然保留下来;它没有专门关注UNIX的任何具体分发版本,而是突出介绍了Solaris和Linux中的各种变型。

组织结构

这一版在逻辑上划分为用户部分和程序设计部分。UNIX基础知识仅限于前11章,这部分内容在讨论联网工具时达到高潮。接下来的7章涵盖了程序设计的相关资料,包括awk、shell程序设计、系统程序设计和perl。

UNIX简介  第1章通过一个简单的实践练习揭示了UNIX的核心概念。接下来是UNIX的发展简史及功能展示。这一章还向读者介绍了kernel和shell,它们共同处理系统的工作负载。在为开发可移植应用程序而构建框架的过程中,一些标准机构(例如POSIX和The Open Group)扮演着重要角色,学习本章之后将会了解这些机构发挥的作用。

第2章介绍了UNIX命令行的结构。它还讨论了使用man命令查询联机文档的技巧。我们将学习使用电子邮件程序,改变密码,并了解系统中发生了什么。我们可能会出错,而且迟早会出错,所以还要知道如何使用键盘进行纠正。

文件  文件是UNIX的两大支柱之一,接下来的三章将讨论文件。第3章讨论了系统中各种类型的文件,以及处理这些文件的命令。我们将学习如何创建目录、在目录结构中导航定位、复制和删除目录中的文件。还将学习如何使用pico编辑器来编辑文件。UNIX还提供了许多压缩实用工具,可以用来节省磁盘空间。

文件拥有属性(特性),第4章介绍了文件的主要属性,特别是用ls -l命令显示的属性。要知道,文件和目录面对攻击都是大门洞开的,所以要学会如何通过管理它们的权限来提供保护。利用链接,以多个名称来访问同一文件。我们可能还会忘记文件的存放位置,所以需要熟悉find命令。

一个人的工作效率还取决于他对编辑器功能的熟悉程度。第5章介绍了vi,它在任何工作环境下都是功能最强大的文本编辑器之一。程序员使用这一编辑器的次数可能比其他任何人都多,所以本章中的大多数例子都采用程序代码段。附录D中对vi的功能进行了总结。

shell和进程  现在需要理解一个非常重要的程序,我们总是和它打交道的,那就是shell。第6章介绍了shell的解释功能,包括它的许多元字符。我们将学习使用通配符,用单个模式来匹配一组类似的文件名。使用重定向和管道来操控命令的输入和输出。shell也是一门编程语言,所以必须要等到第13章才能完全理解它。

第7章介绍了进程,它是UNIX系统的另一支柱。进程与文件类似,也拥有属性。这一章将帮助读者理解如何用fork-exec机制来创建进程,学习控制进程,在前台和后台之间移动它们,还将学习如何通过发送信号来终止进程。

UNIX shell为定制环境提供了很好的机会(第8章)。要理解和使用shell变量、创建命令别名。选择一种提供所有这些功能的合适shell,并学习使用初始化脚本来保存对环境的修改。

过滤器  接下来的两章讨论过滤器——这是UNIX工具包中的一些特殊命令,负责所有文本处理任务。第9章介绍了一些简单的过滤器,并说明它们在相互连接时,如何最为有效。专门有一个示例小节,其中给出了现实生活中的三个应用,它们都是在管道中使用这些过滤器加以解决的。

第10章讨论了两种功能强大的过滤器——grep和sed,它们共同处理所有的模式查找、编辑和替换操作。这里将介绍正则表达式,它是一种精心设计的模式匹配机制,通常会大幅简化查找与替换任务。过滤器内容之后有一章讨论联网工具(第11章),本书第一部分到此结束。

程序设计  后面的7章讨论了UNIX的大多数程序设计功能。在第12章中,awk命令表现得像是一个过滤器和一门程序设计语言。掌握了awk及其标准程序设计构造(例如if、for和while构造),应当就为shell程序设计、perl和C语言程序设计打好了基础。

最后,我们会将所有命令和管道放到shell脚本中。利用第13章讨论的shell程序设计功能,开发交互式与非交互式脚本。学习设计一种脚本,在以不同名字调用这种脚本时,其行为会发生相应变化。对shell程序员来说,本章给出的三个示例脚本是必读内容。

下面4章与C程序设计有着直接或间接的关系。第14章介绍了C语言程序设计的入门知识,这是这一版新增的唯一一章。接下来是程序开发工具(第15章)。利用make实用工具和一种功能强大的调试程序(gdb)来管理和调试程序。另外,还要学习使用SCCS、RCS和CVS来维护一个程序的多个版本。

本书有两章介绍了系统调用在C语言程序设计环境中的应用,第16章是其中的第一章,这一章讨论了与文件和I/O相关的系统调用。编写一些程序,执行面向目录的功能,例如列出文件等,还要学习如何提取和处理存储在inode中的文件属性。

第17章讨论了与进程有关的系统调用。学习使用系统调用中的fork和exec系列来创建进程。一旦理解了内核如何在内存中为已打开文件维护元数据,就能实现重定向和管道,以及如何在程序中处理信号。

我们在第18章遇到了perl,它是UNIX世界中功能最强大的过滤器和脚本设计语言。大多数UNIX概念都内嵌在perl的设计中,许多UNIX用户离开它就什么也做不了,原因就在于此。尽管我们无法在单独一章中充分欣赏perl,但第18章作为一个开端,应当是很有用的。

最后,每个用户都必须了解与系统管理有关的例程任务,第19章讨论了这一领域的基本问题。理解系统提供的重要安全功能。熟悉与系统启动与关闭相关的活动,以及如何加载文件系统,并检查一致性。还要学习如何进行基本的备份操作。

致谢

本书的每一版都使我有机会与新的团队进行合作。本项目的主要推动者是Raghu Srinivasan(全球出版商),同他和Melissa Leick(项目经理)的合作非常愉快。他们在McGraw-Hill指导团队的方式给我留下了深刻印象。我还必须感谢Brenda Rolwes(设计协调者)和Curt Reynolds(他负责营销安排)。还要特别感谢Melinda Bilecki(策划编辑),她一如既往地机敏。她是唯一一位从本书构思阶段就一直参与的人,这种连续性使我受益良多。

还必须感谢审稿者,他们对于本版形式、内容的调整发挥了重要作用:

Ivan Bajic,圣地亚哥州立大学

Bruce Elenbogen,密西根大学迪尔本分校

Ziad Kobti,加拿大温莎大学

Galina Piatnitskaia,密苏里大学圣路易斯分校

Paul Piwowarski,肯塔基大学

Darren Provine,罗文大学

Quazi M. Rahman,加拿大西安大略大学

我要向Deepti Narwat表示最诚挚的谢意,他是负责Cenveo Publisher Services的项目经理,本书的整个生产流程都由他负责。还有其他许多人不能一一提及,但他们都为本书做出了同样的贡献。

最后的“至理名言”

大多数例子都已经在Solaris和Linux上进行了测试,但不能保证它们在所有系统上都可以无错误运行。由于UNIX的分化,实际上不可能在所有UNIX中进行全面测试。如果有一些命令无法以本书说明的方式正常工作,请不要得出系统有bug的结论。不过,这些例子中仍然可能存在bug,欢迎读者指出。

在结束之前,应当给出一点提醒建议。许多人都因为思维混乱、受到误导而错过了UNIX班车,现在深以为憾。不要让这件事再发生在你身上。一旦你决定探索UNIX,应当学习利用已有的功能,不要再去重复实现别人已经实现过的重要功能。你很快就会发现,一个充满机会和激情的世界向你张开了怀抱。一定要充满热情和自信地探索这一领域,我与你同在。

Sumitabha Das

目录

目    录

 

第I 部分  UNIX之用户篇

第1章  UNIX简介 3

1.1  操作系统 4

1.2  UNIX操作系统 5

1.3  了解你的计算机 5

1.4  系统管理员 7

1.5  登录和注销 7

1.5.1  登录 7

1.5.2  注销 8

1.6  实践练习 9

1.6.1  用date和who查看

系统信息 9

1.6.2  用ps查看进程 10

1.6.3  处理文件 11

1.6.4  处理 12

1.7  UNIX的成功之路 14

1.7.1 伯克利:第二学派 14

1.7.2 UNIX的分化 15

1.7.3 互联网 15

1.7.4  Windows的威胁 15

1.8  POSIX和单一UNIX规范 16

1.9  Linux和GNU 16

1.10  UNIX体系结构 17

1.10.1  分工:Kernel和shell 17

1.10.2  文件和进程 18

1.10.3  系统调用 19

1.11  UNIX的功能 19

1.11.1  多用户系统 19

1.11.2  多任务系统 20

1.11.3  应用程序库 20

1.11.4  构建基块方法 20

1.11.5  模式匹配 21

1.11.6  程序设计实用工具 21

1.11.7  文档 21

1.12  小结 22

1.13  自测题 22

1.14  习题 23

第2章  熟悉UNIX命令 25

2.1  命令基础 26

2.1.1  PATH:定位命令 26

2.1.2  命令的存放位置 27

2.2  命令结构 28

2.3  命令应用的灵活性 30

2.4  man:联机帮助 31

2.4.1  导航与查找 33

2.4.2  用man -k和man -f

获取更多帮助 33

2.5  man文档 33

2.5.1  了解man页 34

2.5.2  用man来理解man 35

2.6  echo:显示消息 37

2.7  printf:echo的替代命令 39

2.8  script:记录会话 39

2.9  以mailx命令使用电子邮件 40

2.9.1  发送邮件 40

2.9.2  接收邮件 41

2.9.3  mailx内部命令 42

2.10  passwd:改变密码 43

2.11  uname:显示计算机名和

操作系统 44

2.12  who:了解用户 45

2.13  date:显示系统日期 45

2.14  stty:在出错时 46

2.15  X Window系统 48

2.15.1  终端模拟器 48

2.15.2  文件管理器 49

2.16  小结 50

2.17  自测题 51

2.18  习题 52

第3章  文件系统 55

3.1  文件 56

3.1.1  普通(常规)文件 56

3.1.2  文件 56

3.1.3  设备文件 57

3.2  文件名中有什么 57

3.3  文件系统的层次结构 58

3.4  UNIX文件系统 59

3.5  随命令一起使用绝对路径名 60

3.6  HOME变量和~:主 61

3.7  pwd和cd:在文件系统中

导航 61

3.8  相对路径名(.和..) 63

3.9  mkdir:创建 64

3.10  rmdir:删除 65

3.11  ls:列出文件 66

3.12  cp:复制文件 69

3.13  mv:重命名文件 70

3.14  rm:删除文件 71

3.15  cat:显示和串联文件 73

3.16  more:UNIX分页器 74

3.17  pico:基本文本编辑 76

3.17.1  导航 77

3.17.2  文本编辑 77

3.18  wc:计算行数、字数和

字符数 77

3.19  lp:打印文件 78

3.20  od:查看不可打印字符 80

3.21  dos2unix、unix2dos和

Tofrodos:在DOS和

UNIX之间转换 80

3.22  tar:存档程序 81

3.23  gzip:压缩程序 82

3.24  zip:压缩和存档程序 84

3.25  使用这些命令的其他方式 85

3.26  小结 85

3.27  自测题 86

3.28  习题 86

第4章  文件属性 89

4.1  重温ls(-l):列出文件属性 89

4.2  文件权限 91

4.3  chmod:改变文件权限 92

4.3.1  相对权限 93

4.3.2  绝对赋予权限 94

4.3.3  递推操作(-R) 95

4.4   96

4.4.1  读权限 96

4.4.2  写权限 96

4.4.3  执行权限 98

4.5  umask:默认的文件与

权限 98

4.6  文件系统和inode 99

4.7  ln:创建硬链接 101

4.8  再论ln:创建符号链接 103

4.9  文件所有权 105

4.9.1  chown:改变文件所有权 106

4.9.2  chgrp:改变用户组

所有者 106

4.9.3  如何处理入侵者 107

4.10  修改时间与访问时间 108

4.11  find:定位文件 108

4.11.1  选择准则 110

4.11.2  find操作符(!,-o和-a) 112

4.11.3  操作部分的操作符 112

4.12  小结 113

4.13  自测题 113

4.14  习题 114

第5章  vi/vim编辑器 117

5.1  vi基础 118

5.2  一些提示 120

5.3  输入模式——输入和

替换文本 121

5.3.1  插入和追加文本(i和a) 122

5.3.2  在行的两端插入和追加

文本(I和A) 122

5.3.3  新建一行(o和O) 123

5.3.4  替换文本(r、s、R和S) 124

5.3.5  输入控制字符([Ctrl-v]) 125

5.4  保存文本并退出——ex模式 126

5.4.1  保存工作(:w) 127

5.4.2  保存并退出(:x和:wq) 127

5.4.3  中止编辑(:q) 127

5.4.4  写入选定行 128

5.4.5  退出到shell(:sh和

[Ctrl-z]) 129

5.5  从崩溃中恢复(:recover和-r) 129

5.6  导航 130

5.6.1  4个方向上的相对

移动(h、j、k和l) 131

5.6.2  滚动([Ctrl-f]、[Ctrl-b]、

[Ctrl-d]和[Ctrl-u]) 131

5.6.3  单词导航(b、e和w) 132

5.6.4  移到行的末端(0、|和$) 132

5.6.5  绝对移动(G) 133

5.7  编辑文本,不使用操作符 133

5.7.1  删除文本(x、X和dd) 133

5.7.2  移动文本(p) 134

5.7.3  合并行(J) 134

5.7.4  改变大小写(~) 135

5.8  纠正C程序 135

5.9  用操作符编辑文本 136

5.9.1  删除和移动文本

(d、p和P) 137

5.9.2  复制文本(y、p和P) 138

5.9.3  修改文本(c) 139

5.10  在文件之间复制和

移动文本 139

5.11  撤消之前的编辑

指令(u和U) 140

5.12  查找模式(/和?) 141

5.13  重复上一条命令(.) 142

5.14  替代-查找并替换(:s) 143

5.15  set:定制vi 144

5.16  map:映射键盘的按键 146

5.17  abbr:文本输入的缩写 147

5.18  小结 147

5.19  自测题 148

5.20  习题 149

第6章  shell 151

6.1  作为命令处理器的shell 152

6.2  shell提供的功能 152

6.3  模式匹配——通配符 153

6.3.1  *和? 154

6.3.2  字符类 155

6.3.3  匹配句点 156

6.3.4  综述 157

6.4  转义与引用 157

6.4.1  转义 158

6.4.2  引用 159

6.4.3  在echo中进行转义 159

6.5  重定向 160

6.5.1  标准输入 160

6.5.2  标准输出 162

6.5.3  文件描述符 163

6.5.4  标准错误 164

6.5.5  过滤器——使用标准

输入与标准输出 165

6.6  集体处理 165

6.6.1  复制描述符 166

6.6.2  命令分组 166

6.7  /dev/null和/dev/tty:两个

独立的文件 167

6.8  管道 168

6.9  tee:创建一个T型三通 170

6.10  命令替换 171

6.11  shell变量 172

6.11.1  引用和转义的影响 173

6.11.2  使用shell变量的场合 174

6.12  shell脚本 175

6.13  shell对命令行的处理 175

6.14  有关通配符的更多信息 176

6.15  xargs:构建动态命令行 177

6.16  小结 177

6.17  自测题 178

6.18  习题 179

第7章  进程 181

7.1  进程基础 182

7.2  shell和init 182

7.3  ps:显示进程属性 183

7.4  系统进程和init 184

7.5  进程创建机制 187

7.6  继承的进程属性 188

7.7  不能使用单独进程的情景 190

7.8  进程状态与僵尸

进程(Zombie) 190

7.9  信号处理 191

7.10  在后台运行作业 193

7.10.1  &:不注销 194

7.10.2  nohup:安全注销 194

7.11  作业控制 195

7.12  at和batch:推后执行 198

7.12.1  at:一次执行 198

7.12.2  batch:在批队列中

执行作业 199

7.12.3  限制at和batch的使用 199

7.13  cron和crontab:定期

运行作业 199

7.14  小结 202

7.15  自测题 203

7.16  习题 203

第8章  shell—定制环境 205

8.1  shell 205

8.2  环境变量 207

8.3  常见环境变量 208

8.4  别名 212

8.5  命令历史记录 213

8.5.1  访问之前的命令 214

8.5.2 在先前命令中进行替换 215

8.5.3  使用上一条命令中的

参数($_) 215

8.5.4  历史记录变量 216

8.6  行内命令编辑 217

8.7  ~替换 218

8.8  使用set选项 219

8.9  初始化脚本 220

8.9.1  登录脚本 221

8.9.2  rc文件 221

8.10  C shell 222

8.10.1  局部变量和环境变量 222

8.10.2  别名 224

8.10.3  历史记录 225

8.10.4  其他shell变量 225

8.10.5  初始化脚本 226

8.11  栈操作 226

8.12  小结 228

8.13  自测题 229

8.14  习题 229

第9章  简单过滤器 231

9.1  pr:对文件进行编页 232

9.2  对比文件 233

9.3  cmp:逐字节对比 234

9.4  comm:哪些共同内容 235

9.5  diff:将一个文件转换为

另一文件 236

9.6  head:显示一个文件的开头 236

9.7  tail:显示文件的末尾 237

9.8  cut:垂直划分文件 238

9.9  paste:粘贴文件 240

9.10  sort:对文件进行排序 240

9.11  uniq:定位重复行和

非重复行 244

9.12  tr:变换字符 245

9.13  应用过滤器 247

9.13.1  列出当前中5个

最大的文件 248

9.13.2  创建一份单词使用

情况列表 249

9.13.3  找出两个密码文件

之间的差别 249

9.14  小结 251

9.15  自测题 251

9.16  习题 252

第10章  使用正则表达式的

过滤器——grep和sed 255

10.1  示例数据库 256

10.2  grep:查找模式 256

10.2.1  grep中的引用 257

10.2.2  grep失败的场合 258

10.3  grep选项 258

10.4  基本正则表达式(BRE)

——简介 260

10.4.1  字符类 262

10.4.2  * 262

10.4.3  句点 263

10.4.4  指定模式位置(^和$) 264

10.4.5  元字符失去其意义的

情景 265

10.5  扩展正则表达式(ERE)和

egrep 265

10.5.1  +和? 266

10.5.2  匹配多种模式(|、(和)) 266

10.6  sed:流编辑器 267

10.7  行寻址 269

10.8  sed选项 270

10.9  上下文寻址 271

10.10  将选定行写入文件(w) 272

10.11  文本编辑 272

10.11.1  插入和改变行

(i、a、c) 272

10.11.2  删除行(d) 273

10.12  替换(s) 274

10.12.1  在替换中使用正则

表达式 275

10.12.2  记忆模式(//) 275

10.13  基本正则表达式回顾 276

10.13.1  重复模式(&) 277

10.13.2  间隔正则表达式

(IRE) 277

10.13.3  标记正则表达式

(TRE) 277

10.14  应用IRE和TRE 278

10.14.1  处理电话簿 278

10.14.2  用POSIX兼容的函数

替换过时的函数 279

10.14.3  变换URL中的

路径名 280

10.15  小结 281

10.16  自测题 281

10.17  习题 282

第11章  联网工具 285

11.1  TCP/IP基础知识 286

11.2  解析主机名和IP地址 287

11.2.1  /etc/hosts:主机文件 287

11.2.2  域名系统(DNS) 288

11.3  客户端-服务器:网络

应用程序如何通信 290

11.4  ping:检查网络 291

11.5  telnet:远程登录 292

11.6  ftp:文件传输协议 293

11.6.1  基本文件与处理 293

11.6.2  传送文件 294

11.6.3  匿名FTP 295

11.7  密码学基础 296

11.7.1  对称密钥算法 296

11.7.2  非对称密钥算法 297

11.8  SSH:安全shell 297

11.8.1  主机验证 297

11.8.2  rhosts/shosts验证机制 298

11.8.3  采用对称算法的

用户验证 298

11.8.4  使用SSH代理进行

非交互式登录 300

11.9  SSH协议 301

11.9.1  远程登录与执行

命令(ssh和slogin) 301

11.9.2  用sftp和scp进行

文件传输 302

11.10  互联网邮件 303

11.11  MIME:处理邮件中的

二进制附件 305

11.12  在TCP/IP网络上

使用X Window 306

11.12.1  显示器 306

11.12.2  使用DISPLAY变量 307

11.12.3  使用-display选项 307

11.13  HTTP和万维网 307

11.13.1  统一资源定位符

(URL) 308

11.13.2  HTTP:Web的协议 309

11.13.3  运行外部程序 309

11.13.4  HTML:网页的语言 310

11.13.5  Web浏览器 311

11.14  Web上的多媒体:重温

MIME 311

11.15  小结 312

11.16  自测题 313

11.17  习题 314

第II部分  UNIX之程序员篇

第12章  用awk进行过滤和

程序设计 317

12.1  awk预备知识 318

12.2  使用print和printf 320

12.3  数字处理 321

12.4  变量和表达式 322

12.5  比较与逻辑运算符 324

12.5.1  字符串和数值比较 324

12.5.2  ~和!~:正则表达式

运算符 325

12.5.3  逻辑运算符 327

12.6  -f选项:将awk程序

存储在文件中 327

12.7  BEGIN和END节 328

12.8  位置参数 329

12.9  数组 329

12.9.1  关联(哈希)数组 330

12.9.2  ENVIRON[ ]:环境

数组 331

12.10  内置变量 331

12.11  函数 333

12.12  控制流——if语句 335

12.13  for循环 336

12.14  while循环 338

12.15  结论 339

12.16  小结 340

12.17  自测题 340

12.18  习题 341

第13章  shell程序设计 345

13.1  shell脚本 346

13.1.1  script.sh:一个

简单脚本 346

13.1.2  She-Bang行 347

13.2  read:使脚本变为

交互式的 348

13.3  使用命令行参数 348

13.4  exit和$?:命令的

退出状态 350

13.5  逻辑运算符&&和||

——条件执行 351

13.6  if条件句 351

13.7  使用test和[ ]对表达式求值 353

13.7.1  数值比较 353

13.7.2  [ ]:test的快捷方式 354

13.7.3  字符串比较 355

13.7.4  文件属性检验 355

13.7.5  使用复合条件 357

13.8  两个重要的程序设计习惯 357

13.8.1  以交互式、非交互式

执行一项任务 357

13.8.2  用不同名称调用

脚本($0) 359

13.9  case条件句 359

13.10  expr、bc和basename:

计算与字符串处理 361

13.10.1  用expr进行计算 362

13.10.2  用bc进行浮点计算 362

13.10.3  用expr处理字符串 363

13.10.4  basename:改变

文件名扩展 364

13.11  示例程序1:自动选择

上一个C程序 365

13.12  for:用列表进行循环 366

13.12.1  列表的来源 366

13.12.2  使用for的重要应用 367

13.13  while:循环 367

13.13.1  在循环中处理重定向 368

13.13.2  使用while等待文件 369

13.13.3  找出用户占用的空间 370

13.13.4  break和continue 371

13.14  示例脚本2:向备份文件

提供数字扩展名 371

13.15  用set和shift处理

位置参数 373

13.15.1  按名称杀死进程 374

13.15.2  shift:左移位置参数 374

13.15.3  IFS变量:set的

默认分隔符 375

13.16  示例脚本3:已下载

文件的 376

13.17  Here文档(<<) 378

13.18  shell函数 379

13.19  trap:脚本如何处理信号 380

13.20  eval:两次求值 381

13.21  exec语句 382

13.22  小结 382

13.23  自测题 383

13.24  习题 384

第14章  perl——高级操纵器 387

14.1  perl预备知识 388

14.2  变量和常数 389

14.3  运算符 391

14.3.1  比较与逻辑运算符 391

14.3.2  串联运算符和重复

运算符(.和x) 392

14.4  标准条件句与循环 392

14.4.1  if条件句 393

14.4.2  while、do-while和

for循环 393

14.5  从命令行参数读取文件 394

14.5.1  用单行代码读取文件 395

14.5.2  在脚本中读取文件 395

14.6  当前行号($.)和范围

运算符(..) 396

14.7  $_:默认变量 396

14.8  字符串处理函数 397

14.9  列表和数组 399

14.10  foreach:循环遍历

一个列表 401

14.11  两个重要的列表函数 402

14.11.1  split:分割到列表或

数组中 402

14.11.2  join:联接列表 404

14.12  dec2bin.pl:将十进制数

变换为二进制 404

14.13  关联数组 405

14.14  使用正则表达式 407

14.14.1  识别空白、数位和单词 407

14.14.2  IRE的TRE功能 408

14.15  用s和tr函数替换 409

14.16  文件处理 411

14.17  文件测试 412

14.18  子例程 413

14.19  用perl进行CGI程序设计——概述 414

14.19.1  查询字符串 414

14.19.2  GET和POST:

请求方法 415

14.20  小结 415

14.21  自测题 416

14.22  习题 417

第15章  C语言简介 421

15.1  C语言 422

15.2  first_prog.c:理解我们的第一个C程序 423

15.2.1  预处理器部分 424

15.2.2  主体 424

15.2.3  main:独一无二的函数 425

15.3  printf和scanf:两个重要函数 426

15.3.1  printf:打印到终端 426

15.3.2  scanf:由键盘输入 427

15.4  变量和常数 427

15.5  基本数据类型 428

15.5.1  整型 428

15.5.2  浮点类型 429

15.5.3  字符类型 430

15.6  sizeof.c:确定基本数据

类型的大小 431

15.7  符号常量:有名称的常量 432

15.8  数组 432

15.9  arrays.c:打印数组元素 433

15.10  结构 434

15.11  运算符和表达式 435

15.11.1  位运算符 436

15.11.2  自动变换 436

15.11.3  隐式变换 437

15.12  type_conversion.c:演示类型变换 438

15.13  求值顺序 440

15.13.1  运算符优先级 440

15.13.2  运算符结合性 441

15.14  控制流回顾 441

15.14.1  用switch进行决策 442

15.14.2  用do-while重复 443

15.14.3  break和continue 443

15.15  函数 444

15.16  first_func.c:两个参数和

返回值 445

15.17  函数实参、形参和局部

变量 446

15.17.1  按值传递 447

15.17.2  swap_failure.c:形参与局部变量的可见性 448

15.17.3  以数组为函数实参 449

15.17.4  以结构作为函数实参 450

15.18  指针 450

15.19  pointers.c:指针的基本功能 452

15.20  指针属性 453

15.20.1  指针运算 453

15.20.2  其他属性 454

15.21  指针和函数 455

15.21.1  解决交换问题 455

15.21.2  用指针返回多个值 456

15.22  指针和其他数据类型 456

15.22.1  指针和数组 456

15.22.2  指针和字符串 457

15.22.3  字符串数组 458

15.22.4  指针和结构 458

15.23  小结 459

15.24  自测题 460

15.25  习题 461

第16章  程序开发工具 463

16.1  处理拥有多个源文件的C应用程序 463

16.1.1  包含多个源文件的应用程序 464

16.1.2  编译和链接应用程序 466

16.1.3  为什么需要.o文件 467

16.2  make:使程序保持最新 468

16.2.1  删除冗余 470

16.2.2  make的其他功能:清理与备份 470

16.2.3  宏 471

16.3  ar:生成库(档案) 472

16.3.1  使用库 473

16.3.2  用make维护档案 474

16.4  静态库和共享库 474

16.5  用SCCS、RCS和CVS

实现版本控制 475

16.6  SCCS会话 476

16.6.1  admin:创建一个SCCS文件 477

16.6.2  get:签出 477

16.6.3  delta:签入 478

16.6.4  unget:如果改变主意 480

16.7  活动与历史信息 481

16.7.1  sact:显示活动状态 481

16.7.2  prs:显示SCCS历史 481

16.8  继续以SCCS编辑 482

16.8.1  get -r:改变默认的

编号顺序 482

16.8.2  处理多个版本 483

16.8.3  rmdel和comb:删除和

合并版本 484

16.8.4  使用标识关键字 485

16.9  控制对SCCS的访问权限 486

16.9.1  控制用户访问 486

16.9.2  控制发布版本 486

16.10  版本控制系统(RCS) 487

16.10.1  用ci创建RCS文件 488

16.10.2  co和ci:签出和签入 488

16.10.3  指定修订 489

16.10.4  rlog和rcs:其他

RCS功能 490

16.11  并发版本系统(CVS) 492

16.11.1  建立存储库 493

16.11.2  导入文件 493

16.11.3  签出 494

16.11.4  编辑和签入 494

16.11.5  合并和解决冲突 495

16.11.6  设置标记并导出

存储库 496

16.11.7  其他功能 496

16.12  用gdb调试程序 497

16.12.1  启动gdb 500

16.12.2  使用断点 501

16.12.3  单步执行程序 502

16.12.4  再赋值 503

16.12.5  设定观察点 504

16.12.6  gdb的其他功能 505

16.13  小结 506

16.14  自测题 506

16.15  习题 507

第17章  系统程序设计I——文件 509

17.1  系统调用的基础知识 510

17.1.1  系统调用剖析 510

17.1.2  系统调用与库

函数的对比 510

17.2  errno和perror:处理错误 511

17.3  open:打开和创建文件 513

17.4  close:关闭文件 515

17.5  read:读取文件 516

17.6  write:写文件 516

17.7  ccp.c:复制文件 517

17.8  lseek:定位偏移指针 519

17.9  truncate和ftruncate:截短文件 521

17.10  umask:在创建期间修改文件权限 522

17.11  导航 523

17.12  读取 524

17.13  修改中的项目 526

17.13.1  mkdir和rmdir:创建和删除 526

17.13.2  link和symlink:创建硬链接和符号链接 526

17.13.3  unlink:删除链接 527

17.13.4  rename:对文件、或符号链接重命名 527

17.14  读取Inode:struct stat和stat 528

17.14.1  attributes.c:显示一些文件属性 529

17.14.2  S_IFMT:处理st_mode成员 530

17.14.3  用S_ISxxx宏确定文件类型 530

17.14.4  访问权限位 531

17.14.5  lsdir.c:仅列出 531

17.15  access:检查实际用户的权限 533

17.16  修改文件属性 534

17.16.1  chmod和fchmod:

改变文件权限 535

17.16.2  chown:改变所有权 535

17.16.3  utime:改变时间戳记 536

17.16.4  atimemtime.c:创建一个具有相同时间

戳记的文件 536

17.17  小结 537

17.18  自测题 538

17.19  习题 539

第18章  系统程序设计II

——进程控制 541

18.1  进程回顾 541

18.1.1  虚拟地址空间 542

18.1.2  进程表 543

18.2  进程环境 544

18.3  fork:复制当前进程 545

18.4  exec:进程创建的最终

步骤 547

18.4.1  execl和execv:关键

成员 548

18.4.2  其他exec成员 549

18.5  收集退出状态 550

18.5.1  wait:当父进程等待时 550

18.5.2  waitpid:一种功能更

强大的等待机制 551

18.6  fork_exec_wait.c:使用

全部三个调用 552

18.7  文件共享 553

18.7.1  文件说明符表 554

18.7.2  文件表 554

18.7.3  vnode表 555

18.7.4  当链接发生变化时 555

18.8  文件说明符处理 556

18.8.1  dup和dup2:复制文件说明符 556

18.8.2  redirection.c:最后讨论重定向 557

18.8.3  fcntl:对其推荐程度高于dup和dup2 559

18.9  信号处理 559

18.10  sigaction:安装信号处理器 561

18.10.1  signal.c:捕获SIGALRM信号 563

18.10.2  捕获终端生成的信号 564

18.11  killprocess.c:使用fork-exec-wait和SIGCHLD 565

18.12  用未命名管道实现进程间通信 567

18.12.1  和fork一起使用pipe 568

18.12.2  pipe2.c:在管道中运行UNIX命令 569

18.13  小结 570

18.14  自测题 571

18.15  习题 572

第III部分  系 统 管 理

第19章  系统管理 577

19.1  root:系统管理员的登录 578

19.2  管理员的特权 579

19.3  用户管理 580

19.3.1  理解/etc/group 580

19.3.2  理解/etc/passwd 581

19.3.3  添加和修改用户配置文件 582

19.4  维护安全 583

19.4.1  受限制的shell 583

19.4.2  Set-User-Id(SUID):临时能力 584

19.4.3  粘着位 585

19.5  启动与关机 585

19.5.1  启动 585

19.5.2  关机 586

19.6  init如何控制系统 587

19.6.1  init如何创建shell 588

19.6.2  rc脚本 589

19.7  设备文件 590

19.7.1  块设备和字符设备 590

19.7.2  主次设备号 591

19.8  文件系统 591

19.8.1  文件系统的组成部分 592

19.8.2  标准文件系统及其类型 592

19.9  加载和卸载文件系统 593

19.9.1  mount:加载文件系统 593

19.9.2  umount:卸载文件系统 594

19.10  fsck:文件系统检查 595

19.11  管理磁盘空间 596

19.11.1  df:报告空闲空间 596

19.11.2  du:磁盘利用率 596

19.11.3  find回顾:管理员的工具 597

19.12  处理软盘 597

19.12.1  format和fdformat:格式化磁盘 598

19.12.2  dd:复制磁盘 598

19.12.3  处理DOS磁盘 598

19.13  tar:备份文件 600

19.13.1  备份文件(-c) 600

19.13.2  恢复文件(-x) 601

19.13.3  显示档案(-t) 602

19.13.4  其他选项 602

19.14  用rpm安装程序 603

19.14.1  安装和升级包 603

19.14.2  删除包 604

19.14.3  查询包 604

19.15  小结 606

19.16  自测题 607

19.17  习题 607

附录A  C shell——程序设计构造 609

附录B  Korn和Bash shell

——独有的程序设计构造 617

附录C  GNU emacs编辑器 625

附录D  vi/vim命令参考 653

附录E  正则表达式超集 661

附录F  常用操作指南 665

附录G  ASCII字符集 671

附录H  术语表 677

附录I  自测题解答 695 

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个