目录 1
前言 1
第一章 简介 13
1.01 UNIX特殊在什么地方? 13
1.02 谁接收用户的输入? 15
1.03 将程序设计成协同工作方式 16
1.04 用管道创建新工具 17
1.05 任何人都可以对shell编程 19
1.06 用于编辑的超级工具 20
1.07 让用户更加高效 21
1.08 shell的种类 22
1.09 正在运行哪个shell? 24
1.10 内部命令和外部命令 25
1.11 shell如何执行其他命令? 26
1.12 shell脚本的组成 26
1.13 为什么基本原理很重要? 27
1.14 内核和后台进程(daemon) 28
1.15 文件名 30
1.16 通配符 31
1.17 扩展文件名 33
7.08 在shell提示符中突出显示 1 35
1.18 谁处理通配符? 35
1.19 文件系统的树型结构 36
1.20 用户的主目录 38
1.21 创建路径 39
1.22 UNIX如何跟踪文件:索引节点 41
1.23 文件访问权限 42
1.24 超级用户(root) 46
1.25 访问目录 46
1.26 多用户系统可以做什么? 47
1.27 后台处理如何工作? 48
1.28 后台处理的一些注意事项 49
1.29 何时文件变成非文件? 50
1.30 重定向输入和输出 51
1.31 X Window系统 51
1.32 一个大的漏洞 52
1.33 UNIX联网和通信 53
1.34 UNIX有什么问题? 55
45.36 shell锁文件 1 58
第二章 登录 59
2.01 定制shell 59
第一部分 请放轻松 59
2.02 shell设置文件——哪个、何处和为什么 59
2.03 shell设置文件的内容 62
2.04 改变账户设置的提示:使shell随时可用 63
2.05 提高登录速度的技巧 63
2.06 在shell设置文件中使用绝对路径名 66
2.07 C shell设置文件没有被读入时该怎么办? 67
2.08 识别登录shell 68
2.09 用设置提示符测试加速C shell 69
2.10 设置提示符测试中的注意事项 70
2.11 使用$-测试的快速ksh和bash启动 71
2.12 不同终端的自动设置 71
2.13 设置每台主机所需的.cshrc.$HOST文件 74
2.14 motd.diff:在登录信息中显示新内容 75
2.15 整理登录:仅显示登录信息一次 76
2.16 已获得认可的shell:使用未获认可的登录shell 77
第三章 退出 80
3.01 退出时执行命令 80
3.02 在Bourne/Korn shell退出时执行命令 81
3.03 电子幸运饼 82
3.04 自动清除文件 82
3.05 阻止意外的C shell退出 83
3.06 阻止意外的Bourne shell退出 84
3.07 用screen分离会话 85
3.08 我使用的tty是什么? 86
第四章 组织主目录 87
4.01 什么?我们自己组织? 87
4.02 存放程序和脚本的bin目录 88
4.03 组织非执行脚本 88
4.04 Emacs 小程序目录 89
4.05 私有(个人)目录 89
4.06 命名文件 90
4.07 生成更多的目录! 91
4.08 生成目录的方法 92
4.09 用.exrc文件建立vi 93
4.10 用whereiz找出所有的命令版本 94
第五章 设置用户终端类型 96
5.01 关于终端有许多内容需要了解 96
5.02 终端数据库的思想 96
5.03 登录时设置终端类型 98
5.04 用tset设置TERMCAP变量 101
5.05 查询用户终端类型:qterm 101
5.06 检查清单:登录时终端挂起 104
5.07 termcap和terminfo能完成什么和不能控制什么? 105
5.08 终端转义序列 106
5.09 设置擦除、终止和中断字符 107
5.10 找出可以使用的终端名 109
5.11 用tset初始化终端 111
5.12 用tput初始化终端 112
6.01 环境变量有什么好处? 114
第六章 shell及环境变量 114
6.02 父-子关系 116
6.03 预定义的环境变量 117
6.04 PATH环境变量 119
6.06 TZ环境变量 121
6.05 PATH和path 121
6.07 日本现在是什么时间? 122
6.08 shell变量 123
6.09 特殊的C shell变量 125
6.10 用不同的临时环境执行命令 127
第七章 设置用户shell提示符 128
7.01 为什么要改变用户提示符? 128
703 C shell提示符在vi、rsh等中造成的麻烦 129
7.02 设置提示符基础 129
7.04 用内置命令进行快速提示符设置 130
7.05 多行shell提示符 132
7.06 用户终端状态行中的对话信息 133
7.07 初学者的“菜单提示符” 135
7.09 用$SHLVL显示subshell层 137
7.10 空白的shell提示符有什么好处? 139
7.11 用户提示符中的dirs:比$cwd好 140
7.12 通过外部命令发出信号来设置变量 141
7.13 bash中的预提示命令 143
第八章 shell如何解释用户的输入 147
8.01 shell能做些什么? 147
第二部分 让计算机承担繁琐的工作 147
8.02 bash简介 148
8.03 tcsh简介 149
8.04 命令评价和意外地覆盖文件 150
8.05 命令行的评价(evaluation) 151
8.06 输出命令行参数 153
8.07 设置用户搜索路径 156
8.08 用户不应该运行的命令目录 158
8.09 别名中的通配符 159
8.10 eval:当用户需要另外一个机会时 160
8.11 bash将用哪一个? 162
8.12 C shell将使用哪一个? 163
8.13 是“2>&1>file”还是“>file 2>&1”? 166
8.14 Bourne shell引用 166
8.15 Bourne shell引用和C shell引用之间的不同 171
8.16 引用处理文件名中的特殊字符 173
8.17 verbose和echo变量显示引用 174
8.18 here文档 175
8.19 “特殊”字符和操作符 176
8.20 有多少个反斜杠? 180
第九章 快捷地使用命令行 182
9.01 UNIX命令行的特殊之处 182
9.02 用行删除或字擦除快速修复一行 183
9.03 用CTRL-r重新显示命令行 184
9.04 能否使用通配符创建文件? 185
9.05 用{}建立串 185
9.06 串编辑(冒号)操作符 187
9.07 ksh和bash中的串编辑 189
9.08 文件名完成:加速文件名输入 190
9.09 在文件名完成中不要匹配无用文件 192
9.10 文件名完成并不总是万灵丹 192
9.11 用foreach循环重复一个命令 193
9.12 Bourne shell的for循环 195
9.13 多行命令,次提示符 196
9.14 将here文档用于格式化信件等 197
9.15 针对复杂命令的一次性脚本 198
9.16 命令替换 199
9.17 用临时文件处理一系列文本 201
9.18 进程替换 202
9.19 超前输入 205
9.20 命令行中太多的文件 207
9.21 用xargs处理较长的命令行 208
9.22 xargs:空格和换行的问题 210
9.23 “参数太长”错误的解决方法 211
9.24 编辑Is-l、grep等的输出来获得文件列表 212
9.25 C shell重复命令 216
9.26 Expect 216
第十章 别名 222
10.01 创建自定义命令 222
10.02 常用命令的别名 222
10.03 带有命令行参数的C shell别名 226
10.04 ksh和bash中的别名 228
10.05 对脚本执行source命令 228
10.06 避免C shell的别名循环 230
10.07 如何在C shell别名中放入if-then-else 231
10.08 用makealias和quote在csh别名中修正引用 232
10.09 Shell函数 233
10.10 模拟的Bourne shell函数和别名 234
第十一章 历史机制 236
11.01 历史机制 236
11.02 历史简述 237
11.03 我喜爱!$ 238
11.04 我喜爱!:n* 239
11.05 我喜爱^^ 240
11.06 为安全起见对通配符使用!$ 240
11.07 历史替换 241
11.08 重复命令循环 246
11.09 对一个文件执行一系列命令 247
11.10 首先用:p检查历史 248
11.11 退出时保存历史 248
11.12 将历史传给另外一个shell 251
11.13 shell命令行编辑 252
11.14 进行交互式历史编辑的其他方法 254
11.15 用histchars改变C shell的历史字符 256
11.16 不必改变历史字符 257
第十二章 作业控制 258
12.01 作业控制:快速运行作业,停止失控作业 258
12.02 指向作业的其他方法 261
12.04 作业控制和自动写入:真正节省时间 262
12.03 “当前作业”不总是用户所期望的 262
12.05 系统超载?试着停止一些作业 263
12.06 作业改变状态时通知用户 264
12.07 用stty tostop停止后台输出 265
12.08 作业控制简述 266
12.09 用screen执行多个shell会话 267
第十三章 重定向输入和输出 269
13.01 使用标准输入和输出 269
13.02 cat只有一个参数并不够 272
13.04 用管道连接到分页程序时的问题 273
13.03 (仅)将标准错误发给管道 273
13.05 在C shell中重定向:是否也会捕获错误? 275
13.06 用noclobber确保I/O重定向的安全性 276
13.07 subshell操作符() 277
13.08 使用{列表}对Bourne shell命令进行分组 279
13.09 用tee将输出发送到更多的地方 280
13.10 如何将几个命令tee到一个文件? 281
13.11 tpipe——重定向stdout到多个地方 281
13.13 “文件名”- 283
13.12 写到多个终端来示范 283
13.14 空文件可以干什么? 284
13.15 满位存储桶能干什么:-) 285
13.16 用logerrs来存储和显示错误 286
第三部分 文件系统 291
第十四章 快速移动 291
14.01 熟悉文件系统 291
14.02 使用相对路径和绝对路径名 292
14.03 当前目录的好处是什么? 294
14.04 UNIX如何寻找用户的当前目录? 295
14.05 cdpath:当用户改变目录时可以节省时间 297
14.06 shell的pushd和popd命令 298
14.07 pushd的很好的别名 300
14.09 通过目录的首部执行cd命令 301
14.08 用别名快速cd 301
14.10 变量帮助用户寻找目录和文件 303
14.11 快速查找(任何用户的)主目录 305
14.12 用shell变量找到用户的位置 306
14.13 用户究竟位于哪个目录? 306
14.14 用户进入/退出一个目录时自动设置 308
15.01 文件命名通配符 310
第十五章 通配符 310
15.02 文件名通配符简述 312
15.03 在Korn(和Bourne)shell中增加{}操作符 313
15.04 如果通配符不匹配怎么办? 314
15.05 用通配符匹配所有”圆点文件” 315
15.06 在路径名中不应该使用通配符的情形 316
15.07 用grep-l获取匹配文件列表 316
15.08 用grep-c获取非匹配文件列表 317
15.09 nom:列出不匹配通配符的文件 318
15.10 仅匹配目录的通配符 320
16.02 用Is-t和Is-u寻找最老的和最新的文件 322
第十六章 寻找指定文件 322
16.01 除了find命令以外的方法 322
16.03 重排Is列表 325
16.05 三个UNIX文件时间 326
16.04 用Is-R列出所有子目录 326
16.06 clf,cls:“被压缩的”1s列表 327
16.07 ls的快捷方式:ll,lf,lg等 329
16.08 ls-d选项 330
16.09 列出最近改变的文件的别名 331
16.10 findcmd:在搜索路径中寻找命令 332
16.11 用ls-A和-a显示隐藏文件 332
16.12 有用的ls别名 333
16.14 显示文件名中的非打印字符 335
16.13 不能访问一个文件吗?寻找文件名中的空格 335
16.15 用于UNIX转换的有趣脚本:dir 337
16.16 自动选择一个惟一的文件名 337
16.17 从文件的路径名获取目录名称 338
16.18 列出刚刚创建/编辑的文件 339
16.19 stree:简单目录树 339
16.20 可视目录树程序vtree 341
16.21 找出具有相同名称的所有目录 341
16.22 用dircmp比较两个目录树 342
16.23 比较两个目录树中的文件名 344
16.24 根据类型计数文件 344
16.25 由时间和大小列出文件 345
16.26 用findtext寻找文本文件 346
16.28 oldlinks:寻找未连接的符号链接 349
16.27 newer:打印最新文件的名称 349
16.29 sls:带有可选格式的超级ls 350
第十七章 用find寻找文件 352
17.01 find命令很好,问题是如何使用它 352
17.02 深入目录树 354
17.03 不要忘记-print 356
17.04 寻找有特殊名称的文件 356
17.05 寻找旧文件 357
17.06 成为find搜索操作符的专家 358
17.07 寻找待找文件的时间 360
17.08 确切的文件时间比较 360
17.09 -newer的问题 361
17.10 对用户所找到的文件执行命令 362
17.11 使用-exec创建自定义的测试 364
17.12 用一个命令寻找多个内容 364
17.13 根据类型搜索文件 366
17.15 根据权限搜索文件 367
17.14 根据大小搜索文件 367
17.16 根据所有者和组搜索 369
17.17 复制一个目录树(不包含带有find{}操作符的路径名) 369
17.18 使用“快速find” 370
17.19 用find数据库更快速地寻找文件 372
17.20 grep目录树 375
17.21 lookfor:哪个文件含有那个词? 376
17.22 寻找到文件的链接 377
17.23 用-prune寻找文件 378
17.24 在find中略过目录树的一些部分(更具选择性的-prune) 380
17.25 阻止find搜索联网的文件系统 380
第十八章 链接、重命名和拷贝文件 382
18.01 拷贝文件的复杂之处 382
18.02 目录中真正有什么? 383
18.03 有两个或更多名称的文件 384
18.04 关于链接的更多内容 386
18.05 创建和删除链接 389
18.06 陈旧的符号链接 391
18.07 链接目录 392
18.08 为符号链接显示实际的文件名 394
18.09 重命名、拷贝或者比较一组文件 394
18.10 完成任务的方法不止一种 395
18.11 用ren重命名文件 397
18.12 交互式地重命名一列文件 398
18.13 另一种方法 399
18.14 重链接多个符号链接 400
18.15 用cp-r拷贝目录树 400
18.16 用(tar | tar)拷贝目录树 403
第十九章 创建和读取档案 406
19.01 打包和移动 406
19.02 shell档案简介 407
19.03 unshar:拆除shell档案 409
19.04 unshar的一个简单版本 409
19.05 使用tar创建和打开档案 410
19.06 GNU tar范例 412
19.07 从压缩档案中解压文件 413
19.09 一个系统V的磁带存档程序:cpio 414
19.08 冗长tar的问题 414
第二十章 备份文件 416
20.01 tar简述 416
20.02 生成用户自己的备份 417
20.03 如何用本地磁带驱动器生成备份 418
20.04 使用tar恢复磁带上的文件 421
20.05 在远程磁带驱动器上使用tar 423
20.06 在远程机器上写磁带驱动器 424
20.08 通知tar排除或者包含指定文件 426
20.07 为选择的备份创建时间标记文件 426
20.10 避免对tar使用绝对路径 430
20.09 程序不能识别通配符时的情况 430
20.11 按正确的顺序获得tar的参数 431
20.12 用SCCS或者RCS保护文件 432
20.13 SCCS基础 433
20.14 RCS基础 434
20.15 用rcsrevs列出RCS修正号 437
21.02 存放临时文件的更好的地方:/tmp 439
21.01 混杂的内容 439
第二十一章 关于管理文件的更多内容 439
21.03 命名临时文件 440
21.04 为什么/tmp和/usr/tmp都要使用? 442
21.05 文件最后访问时间的好处 443
21.06 文件的索引节点改变(不是”创建”!)时间 444
21.07 用touch设置文件的修改时间 444
21.08 MAILCHECK和mail变量的使用不局限于对邮件的检查 446
21.09 用make自动更新文件的打印输出 449
21.10 在屏幕顶部保留一个目录列表:dirtop 450
21.11 比较安全的删除、移动和拷贝 451
21.12 将文件复制到目录 452
21.13 用stat读取索引节点 452
21.14 自动将日期附加给文件名 453
22.01 文件所有权和安全性的介绍 454
第二十二章 文件的安全性、所有权及共享 454
22.02 文件和目录权限介绍 455
22.03 谁将拥有新文件? 459
22.04 设置确切的umask 460
22.05 在一个目录中带有setgid位的组权限 460
22.06 用sticky位保护文件 461
22.07 使用chmod来改变文件的权限 462
22.08 方便的chmod=操作符 464
22.09 保护重要文件:让这些文件不可写 464
22.10 cx,cw,c-w:快速改变文件权限 465
22.11 漏洞:不使用写权限来修改文件 466
22.12 用户可以访问但不能列出的目录 467
22.13 组和组所有权 469
22.14 将用户加入到一个组来拒绝权限 470
22.15 改变权限 471
22.16 用cpmod复制权限 472
22.17 提高crypt安全性的方法 473
22.18 为了安全起见清除终端来阻止老化 474
22.19 shell脚本必须为可读和(通常)可执行 475
22.20 为什么不能在BSD UNIX下改变文件的所有权? 476
22.21 没有chown如何改变文件的所有权呢? 476
22.22 su命令并不仅仅对于超级用户可用 477
23.01 创建和删除文件的循环 482
23.02 rm命令和它的危险 482
第二十三章 删除文件 482
23.03 使rm更安全的技巧 484
23.04 用yes总是回答“Yes”或者“No” 485
23.05 删除一些,留下一些 485
23.06 交互式地删除文件时比较快的方法 486
23.07 在目录中进行比较安全的文件删除 487
23.08 安全删除:正面的和反面的 488
23.09 delete:避免意外地删除文件 488
23.10 无所顾忌地删除:rm-f 491
23.11 删除名字特殊的文件 492
23.12 使用通配符删除名字特殊的文件 493
23.14 处理以短划线(-)开始的文件名 494
23.13 删除空名文件 494
23.15 用unlink删除名字特殊的文件 495
23.17 关于删除目录的问题 496
23.16 由索引号删除一个名字特殊的文件 496
23.18 如何创建和删除目录 498
23.19 删除(BSD)不需要阅读的手册页 499
23.20 删除旧文件 499
23.21 删除除了某个文件以外的所有文件 501
23.22 使用find命令清除不需要的文件 502
第二十四章 获取磁盘空间的其他方法 504
24.01 清空而不是删除一个文件 504
24.02 用“位存储桶”日志文件和邮箱节省空间 505
24.03 删除打开的文件并不是一个好想法 506
24.04 使用链接节省空间 507
24.05 限制文件大小 508
24.06 使用制表符节省空间 508
24.07 压缩文件以节省空间 509
24.08 节省空间:tar和压缩目录树 511
24.09 磁盘空间的大小 512
24.10 zloop:在压缩文件上执行一个命令 514
24.11 用zvi、zex和zed来编辑压缩文件 516
24.12 压缩目录树:良好的调整 517
24.13 用strip在可执行文件中节省空间 518
24.14 小心使用strip 519
24.15 整理目录 520
24.16 整理大型目录 521
24.17 磁盘限额 522
24.18 大型文件不一定占用许多磁盘空间 523
第四部分 深入文件 527
第二十五章 显示文件内容 527
25.01 破解难题 527
25.02 运用cat的四种方法 528
25.03 使用more对文件分页 529
25.04 “less”分页程序:功能比“more”更强大 530
25.05 对压缩文件、RCS文件和不可打印文件分页 531
25.06 空白处究竟是什么? 532
25.07 用cat-v或者od-c显示非打印字符 533
25.08 寻找文件类型 535
25.09 增加和删除空白 537
25.11 crush:一个略过所有空白行的cat 538
25.10 压缩额外的空白行 538
25.12 两倍行距,三倍行距 539
25.13 pushin:删除额外的空白 540
25.14 如何查看一个文件的末尾:tail 541
25.15 较好地控制tail 541
25.16 在文件增长时如何查看它? 542
25.17 没有tail时的别名 543
25.18 观察几个文件的增长 543
25.19 使用flip来反转长文件中的行 544
25.20 打印文件头的内容 545
25.21 加行号 546
第二十六章 正则表达式(模式匹配) 547
26.01 这是一个表达式 547
26.02 不要把正则表达式与通配符混淆 548
26.03 理解表达式 549
26.04 在正则表达式中使用元字符 551
26.05 使正则表达式准确无误 560
26.06 正则表达式到底匹配什么? 561
26.07 限制匹配范围 . 562
26.08 不匹配不喜欢的字符 563
26.09 不同UNIX程序的有效元字符 565
26.10 带实例的模式匹配快速参考 566
第二十七章 在文件中查找 571
27.01 grep的不同版本 571
27.02 用grep搜索文本 572
27.03 找出不匹配的文本 573
27.04 仅为单词时才匹配的模式 574
27.05 用egrep对文本扩展查找 574
27.06 快速grep不快 575
27.07 用grep查找一个模式列表 577
27.08 glimpse和agrep 577
27.09 新的grep更快 579
27.10 用rcsgrep搜索RCS文件 580
27.11 使用sed进行多行上下文的grep搜索 582
27.12 用perl生成自定义的grep命令(等等) 582
27.13 用Perl编写的更多类似于grep的程序 583
27.14 复合搜索 585
27.15 快速的限制性搜索 586
27.16 不区分大小写的搜索 587
27.17 在列中搜索字符 588
27.18 用“look”进行快速搜索和拼写检查 588
27.19 寻找二进制文件内部的单词 589
27.20 高亮度的grep 590
第二十八章 文件比较 591
28.01 用diff检查差别 591
28.02 用diff3比较三个不同的版本 593
28.03 上下文diff 595
28.04 并排diff:sdiff 597
28.05 并排比较文件 598
28.06 用sdiff选择 598
28.07 用于非常长文件的diff:bdiff 599
28.08 更友好的diff输出 599
28.09 由diff建立的ex脚本 600
28.10 diff和制表位的问题 603
28.11 cmp和diff 604
28.12 用comm比较两个文件 604
28.13 make不仅仅对程序员有用! 607
28.14 make的更多用途 609
28.15 用diffmk显示troff文件中的变化 610
第二十九章 拼写检查、词计数和文本分析 612
29.01 UNIX的spell命令 612
29.02 用ispell对拼写进行交互式的检查 613
29.03 如何拼写某个单词? 615
29.04 深入spell 616
29.05 向ispell的字典添加单词 618
29.06 计算行、单词和字符:wc 620
29.07 计算每个单词使用的次数 623
29.08 查找aa这样的双字 624
29.09 寻找闭合形式 624
29.10 只对单词操作 626
30.01 详细讲述vi和ex编辑器的理由 629
第五部分 文本编辑 629
目录 629
第三十章 vi使用提示及技巧 629
30.02 内容概要 630
30.03 Mice与vi的对比 630
30.04 运用vi进行多文件编辑 632
30.05 文件之间的编辑 634
30.06 vi与ex的局部设置 635
30.07 利用缓冲区移动或复制文本 636
30.08 利用编号的缓冲区恢复更多的删除内容 636
30.09 使用搜索模式和全局命令 637
30.10 在vi和ex中确认替换 639
30.11 保存原始文件,写入新文件 640
30.12 部分文件的保存 640
30.13 添加到一个现有文件 641
30.14 利用模式移动文本块 641
30.15 实用的全局命令(模式匹配) 642
30.16 计算出现的次数:取消搜索限制 644
30.17 将一行内所有的单词大写 644
30.18 为个别文件自动设置vi选项 645
30.19 modelines:缺点还是优点? 646
30.20 适合多种编辑器的设置文件:以搜索启动 647
30.21 单独设置文件 648
30.22 用UNIX命令过滤文本 648
30.23 vi更安全的全文过滤 651
30.24 vi/ex文件恢复与联网文件系统 652
30.25 退出时,vi-r可能不能写入恢复的缓冲区内容 653
30.26 shell转义:使用一个UNIX命令时运行另一个命令 654
30.27 vi复合搜索 655
30.28 用ctags和tags来跟踪函数和包含文件 657
30.30 vi比双重功能的函数键更智能化 658
30.29 设置多个tags文件 658
30.31 vi缩写词 659
30.32 作为命令使用vi缩写词(在vi间剪切和粘贴) 660
30.33 用vi缩写词修改排版 661
30.34 vi行命令与字符命令 662
30.35 临时空间溢出?使用另一个目录 663
30.36 ex的打开模式可以很方便 664
30.37 整理文本行 666
30.38 使用撤消命令来寻找位置 667
第三十一章 在vi中创建自定义命令 669
31.01 为什么敲键的次数比需要的更多? 669
31.02 用vi映射命令来节省时间和输入量 670
31.03 使用map!的缺点 673
31.04 vi的@函数 674
31.05 运行vi时在窗口里进行粘贴的键映射 676
31.06 保护键不被ex解释 677
31.07 用于重复编辑的映射 679
31.08 vi中键映射的更多例子 680
31.09 .exrc文件范例 682
31.10 重复vi键映射 686
31.11 不使用CAPS LOCK输入大写字母 686
31.12 文本输入模式中不使用光标移动键的光标移动 687
31.13 让光标键在vi文本输入模式下工作 688
31.14 vi映射的重要功能:使用noremap 689
31.15 避免vi执行复杂的宏 690
31.16 用于截断长文本行的vi宏命令 691
第三十二章 GNU Emacs 692
32.01 Emacs:另一种编辑器 692
32.02 Emacs的特点:一本流水账 693
32.03 用户化及如何取消该功能 695
32.04 备份和自动保存文件 695
32.05 将Emacs设置为覆盖模式 697
32.06 命令完成 697
32.07 Mike最喜欢的时间节省器 698
32.08 合理高效地搜索 699
32.09 在使用Emacs之前不设置PWD 700
32.10 在文件中插入二进制字符 701
32.11 使用缩写词模式 701
32.12 解决Emacs的流控制问题 703
32.13 不合理的消遣 704
33.01 为什么行编辑器不是很难上手? 706
第三十三章 批量编辑 706
33.02 编写编辑脚本 707
33.03 行定位 708
33.04 有用的ex命令 710
33.05 在vi中运行编辑脚本 713
33.06 通过只编辑一个文件来改变多个文件 713
33.07 ed/ex批量编辑:避免在无匹配时出错 714
33.08 批量编辑注意事项:大型文件——编辑器的炸弹 715
33.09 patch:不同文件的通用升级程序 716
33.10 用qsubst命令从命令行进行快速全程搜索 718
33.11 快速参考:awk 719
33.12 awk版本 730
第三十四章 sed流编辑器 732
34.01 关于sed必须了解的两点 732
34.02 调用sed 733
34.03 测试和使用sed脚本:checksed,runsed 734
34.04 sed寻址基础 736
34.05 脚本中命令的顺序 738
34.06 每次只做一件事 739
34.07 定界正则表达式 739
34.08 sed替换式中的换行符 740
34.09 引用替换式中的搜索字符串 741
34.10 引用搜索字符串的一部分 742
34.11 搜索和替换:多个匹配中的某一个 743
34.12 文本变换 743
34.13 保留空间:保留缓冲区 744
34.14 转换一行中的部分文本 746
34.15 跨行编辑 748
34.16 谨慎的代笔人 752
34.17 搜索跨行模式 754
34.18 删除多行文本 756
34.19 在哪里都能进行编辑,除了 757
34.20 sed的测试命令 759
34.21 sed退出命令的几个用途 760
34.22 sed退出命令中隐藏的危险 761
34.23 shell脚本中的sed换行符、引用和反斜杠 761
34.24 快速参考:sed 762
第三十五章 超越文本编辑 772
35.01 为什么不是? 772
35.02 用fmt整理文本 773
35.03 fmt的可选项 774
35.04 recomment:整理程序注释块 775
35.05 用behead删除邮件/新闻的标题 777
35.07 offset:缩进文本 778
35.06 用dd实现低级的文件清除 778
35.08 使文件中的行居中 780
35.09 在固定点分割文件:split 780
35.10 根据上下文分割文件:csplit 783
35.11 用tr过滤字符 786
35.12 在ASCII码与EBCDIC码之间进行转换 788
35.13 用dd进行其他转换 789
35.14 用cut剪切列或者字段 790
35.15 用colrm剪切列 791
35.16 用cols自动创建文本列 791
35.17 用pr使文本成列排列 793
35.18 按列粘贴文本 795
35.19 用join连接文本行 796
35.20 快速参考:uniq 797
35.21 用IFS分割字符串 798
35.22 对齐参差不齐的列 799
35.23 旋转文本 801
第三十六章 排序 802
36.01 排序 802
36.02 排序字段:sort是如何排序的? 803
36.03 更改字段定界符 805
36.04 空白字段定界符造成的混淆 806
36.05 按字母和数字排序 808
36.06 各种各样的排序提示 809
36.07 对多行记录项进行排序 811
36.08 lensort:根据长度对行进行排序 812
36.09 根据姓氏对名单排序 813
第三十七章 Perl——反常、折衷的垃圾陈列器 814
37.01 关于Perl打算和不打算介绍的内容 814
37.02 为什么要学习Perl语言之一 815
37.03 程序员的三种美德 817
37.04 为什么要学习Perl语言之二 818
37.05 Perl5 821
第六部分 进程管理 825
第三十八章 开始、停止和杀死进程 825
38.01 本章内容 825
38.02 fork和exec 826
38.03 管理进程:全部的概念 827
38.04 subshell 829
38.05 命令ps 831
38.06 控制终端 834
38.07 为什么ps把一些命令显示在小括号内? 835
38.08 什么是信号? 836
38.09 杀死前台作业 837
38.10 用kill命令销毁进程 838
38.11 打印机队列监视器:一个可重新启动的daemon shell脚本 839
38.12 杀死所有的进程 841
38.13 交互地杀死匹配某个模式的进程 842
38.14 进程失去了控制怎么办?——停止它们 844
38.15 清除一个不能杀死的进程 845
38.16 为什么用户不能杀死僵死进程? 845
38.17 在csh中退出时自动杀死后台进程 846
38.18 nohup 847
39.01 时间是什么? 848
39.02 定时程序 848
第三十九章 时间和性能 848
39.03 csh时间变量 850
39.04 用runtime计算平均命令运行时间 852
39.05 为什么系统会那么慢? 853
39.06 lastcomm:正在运行什么命令以及需要用多长时间? 856
39.07 检查系统的负载:uptime 857
39.08 大环境会让系统速度变慢 858
39.09 明白什么时候对其他用户友好以及什么时候不友好 859
39.10 nice的一个注意事项 863
39.11 在BSD UNIX系统下改变作业的优先权 863
39.12 什么使得计算机变慢以及怎样改变它? 864
40.01 非高峰时期的作业提交 868
第四十章 延迟执行 868
40.02 等待一会儿:sleep 869
40.03 at命令 870
40.04 选择at(所希望)运行的shell 870
40.05 避开其他at和cron作业 872
40.06 系统V.4的分批队列 873
40.07 使at作业隐藏 874
40.08 自动重新启动at作业 874
40.09 察看和删除作业 875
40.10 nextday,nextweekday:明天或者下一个工作日 876
40.11 发送给自己的提醒邮件 877
40.12 定期执行程序:工具cron 878
40.13 添加crontab项 882
40.14 在一个cron项中包含标准输入 882
40.15 crontab脚本使得crontab编辑更容易/更安全 883
第七部分 终端设备和打印机 887
第四十一章 终端与串行线设置 887
41.01 更深入的研究 887
41.02 stty及其所有内容 888
41.03 用stty找出终端设置 896
41.04 UNIX系统怎样处理制表符? 896
41.05 为什么有的系统在提示符处退格? 899
41.06 使用sleep程序来保留端口设置 900
41.07 从终端读取长文本行 901
41.08 pty和窗口系统 902
41.09 用来调整终端的命令 902
41.10 在shell程序中使用terminfo的性能 904
41.11 termcap和terminfo是如何描述终端的? 905
41.12 找出终端特殊键发送的字符 911
第四十二章 终端设备可能出现的问题 913
42.01 搞清终端的含义 913
42.02 修改中止的终端或作业 915
42.03 为什么有时候改变TERM却不起作用? 918
42.04 用于重置终端的核对清单 919
42.05 核对清单:屏幕尺寸是否合适? 922
42.06 屏幕尺寸测试文件 926
42.07 termtest:发送重复的字符到终端 929
42.08 擦除错误信息太快怎么办?试试这些办法 929
第四十三章 打印 931
43.01 打印介绍 931
43.02 针对UNIX系统的打印介绍 933
43.03 用命令lpc实现打印机控制 935
43.04 使用不同的打印机 937
43.05 使用符号链接用于假脱机 938
43.07 打印前的快速简单的格式化 939
43.06 打印到一个终端打印机 939
43.08 用pr和fold修改页边空白 941
43.09 缩进文本用于打印 942
43.10 不用pr在文件上添加文件名页眉 943
43.11 很大的字母:banner 944
43.12 排版概述 945
43.13 文本格式化程序nroff,troff,ditroff 948
43.14 nroff/troff和宏命令包 950
43.15 从源文件到打印机 950
43.16 groff 952
43.17 没有nroff吗?试试gnroff或awf 953
43.18 nroff怎样生成粗体字和下划线?怎样撤消它? 954
43.19 撤消引导制表符以及其他一些琐事 955
43.20 显示troff宏定义 957
43.21 用sed预处理troff输入 958
43.22 把文本文件转换成PostScript 960
43.23 psselect:从某PostScript文件中打印某些页 962
43.24 其他PostScript实用程序 963
43.25 可移植的位图软件包 964
第八部分 shell编程 975
第四十四章 针对有经验用户的shell编程指南 975
44.01 每个人都必须学习一些shell编程的内容 975
44.02 编写一个简单的shell程序 977
44.03 shell究竟是什么? 979
44.04 测试系统是如何执行文件的 981
44.05 用Bourne shell的case测试字符串的值 983
44.06 case语句中的模式匹配 984
44.07 UNIX进程的退出状态 985
44.08 用if语句测试退出状态 986
44.09 测试成功 987
44.10 测试退出状态的循环 988
44.11 设置shell(脚本)的退出状态 990
44.12 捕获由中断引起的退出 991
44.13 read:从键盘读取输入 993
44.14 把awk、sed等插入shell脚本中 994
44.15 处理shell脚本中的命令行参数 995
44.16 用一个for循环处理命令行参数 997
44.17 用while和shift处理参数 999
44.18 标准命令行解析 1000
44.19 Bourne shell的set命令 1002
44.20 test:测试文件和字符串 1004
44.21 为一个新命令挑选名称 1005
44.22 查找一个或者多个程序名 1006
44.23 使用.和source命令阅读文件 1007
第四十五章 针对新手的shell编程指南 1008
45.01 基础以外的东西 1008
45.02 关于#和#!的故事 1010
45.03 可以不需要shell来运行你的脚本吗?那么就不要使用它 1011
45.04 试一试#! 1012
45.05 一个自显示的文件以及#!所做的事 1013
45.06 确保用户的脚本能够被Bourne shell运行 1015
45.07 exec命令 1015
45.08 向子进程传递信号 1016
45.09 不被赏识的Bourne shell“:”操作符 1018
45.10 为了安全性和易于清除,只要文件一打开就删除它 1019
45.11 多用途的jot命令 1020
45.12 参数替换 1024
45.13 节省磁盘空间与编程:一个程序的多个名称 1026
45.14 找出最后的命令行参数 1027
45.15 如何清除所有的命令行参数? 1028
45.16 for循环的标准输入 1028
45.17 编写使用多个变量的for循环 1028
45.18 使用basename和dirname 1029
45.19 使用了一些循环控制命令的while循环 1031
45.20 概述:打开文件和文件描述符 1032
45.21 n>&m:交换标准输出和标准错误 1034
45.22 逐行处理文件 1038
45.23 重定向I/O循环的输入输出 1042
45.24 shell可以从它的标准输入读入脚本,但是 1044
45.25 来自标准输入的shell脚本 1044
45.26 引用hereis文档结束符:sh和csh 1045
45.27 为保护”秘密”回答而关闭回显 1046
45.28 快速参考:expr 1046
45.29 使用expr测试字符串中的字符 1049
45.30 获取字符串的一部分 1049
45.31 嵌套的命令替换 1052
45.32 一个更好的读取命令:grabchars 1054
45.33 用一个case语句测试两个字符串 1055
45.34 Bourne shell中的数组 1056
45.35 在脚本中使用控制字符 1057
第四十六章 shell脚本调试和一些注意事项 1061
46.01 调试shell脚本的一些提示 1061
46.02 引用很麻烦吗?想一想,然后使用命令echo 1063
46.03 用Bourne shell调试程序显示一个shell变量 1064
46.04 终止数字测试中的语法错误 1065
46.05 终止字符串测试中的语法错误 1065
46.06 注意Bourne shell的-e程序错误 1066
46.07 引用和命令行参数 1067
46.08 检测失败的内置命令 1069
46.09 如果命令没有返回状态,则测试错误消息 1070
46.10 一个可移植的echo命令 1071
第四十七章 避免使用C shell编程 1073
47.01 为什么? 1073
47.02 C shell编程被认为是有害的 1074
47.03 用if编写条件语句 1082
47.04 C shell变量操作符和表达式 1083
47.05 使用C shell数组 1087
47.06 快速参考:C shell的switch语句 1088
第九部分 其他内容 1093
第四十八章 办公自动化 1093
48.01 内容概要 1093
48.02 在线电话和地址列表 1094
48.03 屏幕上的便签簿 1095
48.04 自动备忘录和更多功能:日历 1096
48.05 leave:按时退出的神奇助手 1099
48.06 为任意月份或年份获得日历:cal 1100
48.07 标识今天日期的cal 1101
48.08 132列终端或打印机使用的日历程序 1102
48.09 使用pcal程序获得PostScript日历 1103
48.10 使用名字和地址 1106
48.11 索引(index)数据库程序 1112
48.12 使用带有过滤器的index 1114
第四十九章 数字操作 1116
49.01 bc:shell提示符下的简单数学运算 1116
49.02 bc:十六进制或二进制换算 1117
49.03 基本换算中的注意事项 1118
49.05 使用cvtbase进行基本换算 1119
49.04 bc的正弦和余弦函数是以弧度为单位的 1119
49.06 使用expr进行快速运算 1120
49.07 使用addup对一列进行统计 1121
49.08 拥有一个电子表格软件是一件非常美妙的事 1122
49.09 使用ipl处理商用图形 1123
第五十章 帮助——在线文档等 1124
50.01 UNIX在线文档 1124
50.02 apropos命令 1126
50.03 在没有apropos的系统中实现apropos的功能 1126
50.04 whatis:单行命令的摘要 1128
50.05 whereis:找出命令的位置 1129
50.06 搜索在线手册页 1129
50.07 UNIX系统如何记住它们的名字? 1131
50.08 使用的是哪个版本? 1131
50.09 阅读排列索引 1134
50.10 不用学习troff就可建立用户自己的手册页 1135
50.11 使用-man宏编写一个简单的手册页 1137
50.12 常见的UNIX错误信息 1139
第五十一章 各种各样有用的程序和珍品 1143
51.01 最后的宝藏 1143
51.02 UNIX怎样保存时间? 1143
51.03 ASCII符:列表和获得值 1144
51.04 系统里有谁? 1146
51.05 用script拷贝用户所做的事情 1146
51.06 清除脚本文件 1147
51.07 当用户失去耐心时 1148
51.08 用行话输入 1149
51.09 制作”登录”shell 1150
51.10 date命令 1151
51.11 制作测试用的任意大小的文件 1152
51.12 你没有足够的笑脸吗? 1152
第五十二章 光盘中的内容 1154
52.01 介绍 1154
52.02 免费软件和UNIX标准程序 1155
52.03 用于UNIX的压缩软件包 1156
52.04 光盘内容的简要描述 1157
52.05 使用超级工具光盘 1178
52.06 没有光驱怎么办? 1191
52.07 获得软件的其他途径 1192
52.08 从源代码构造程序 1195
52.09 来自RTR的软件支持 1210
第五十三章 术语表 1212