unix高级环境编程 例子 代码实现练习 第三章:文件I/O

程序清单 3-1“ 测试能否对标准输入设置偏移量

/**
 * 程序清单 3-1“ 测试能否对标准输入设置偏移量 P51
 *
 * zy:
 * 对lseek函数加深认识。
 * 
 * 书中第一个例子/etc/motd是进入tty的一段文字,所以可以随意调整
 * 书中第二个例子表示对管道进行lseek,但是不可以的
 * 书中第三个例子,我相应的目录下没有找到该文件,我使用mkfifo创建了一个,
 * 但是对其使用我们的程序是无效的,就是什么也不会出现。所以不知道我用mkfifo创建的东西
 * 和书中是不是一个东西。
 * 
 */

#include "apue.h"
#include <stdlib.h>
#include "error.c"

int main(void) {
	if(lseek(STDIN_FILENO,0,SEEK_CUR)==-1){//必须测试其是否等于-1,因为某些设备的偏移量可以是负的
		printf("cannot seek \n ");
	}else{
		printf("seek ok\n ");
	}
	exit(0);
}


结果:
asd@asd-desktop:~/workspace/test/src$ !1029
./a.out </etc/motd 
seek ok
 asd@asd-desktop:~/workspace/test/src$ !1030
cat </etc/motd | ./a.out 
cannot seek 
 asd@asd-desktop:~/workspace/test/src$ !1034
mkfifo fifo
mkfifo: cannot crea
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高级bash编程 高级Bash脚本编程指南(一) 目录 ++++ 第一部分. 热身 1. 为什么使用shell编程 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash变量是不分类型的 4.4. 特殊的变量类型 5. 引用(翻译的可能有问题,特指引号) 5.1. 引用变量 5.2. 转义(\) 6. 退出和退出状态 7. Tests 7.1. Test结构 7.2. 文件测试操作 7.3. 其他比较操作 7.4. 嵌套的if/then条件test 7.5. 检查你的test知识 8. 操作符和相关的主题 8.1. 操作符 8.2. 数字常量 第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环和分支 10.1. 循环 10.2. 嵌套循环 10.3. 循环控制 10.4. 测试与分支(case和select结构) 11. 内部命令与内建 11.1. 作业控制命令 12. 外部过滤器,程序和命令 12.1. 基本命令 12.2. 复杂命令 12.3. 时间/日期 命令 12.4. 文本处理命令 12.5. 文件与归档命令 12.6. 通讯命令 12.7. 终端控制命令 12.8. 数学计算命令 12.9. 混杂命令 13. 系统与管理命令 13.1. 分析一个系统脚本 14. 命令替换 15. 算术扩展 16. I/O 重定向 16.1. 使用exec 16.2. 代码块的重定向 16.3. 应用 17. Here Documents 17.1. Here Strings 18. 休息时间 Part 4. 高级 19. 正则表达式 19.1. 一个简要的正则表达式介绍 19.2. 通配 20. 子shell(Subshells) 21. 受限shell(Restricted Shells) 22. 进程替换 23. 函数 23.1. 复杂函数和函数复杂性 23.2. 局部变量 23.3. 不使用局部变量的递归 24. 别名(Aliases) 25. 列表结构 26. 数组 27. /dev 和 /proc 27.1. /dev 27.2. /proc 28. 关于Zeros和Nulls 29. 调试 30. 选项 31. Gotchas 32. 脚本编程风格 32.1. 非官方的Shell脚本风格 33. 杂项 33.1. 交互式和非交互式的shells和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 33.8.1. 被感染的脚本 33.8.2. 隐藏Shell脚本源码 33.9. 移植话题 33.10. 在Windows下进行Shell编程 34. Bash, 版本 2 和 3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 哪里可以取得帮助? 35.4. 制作这本书的工具 35.4.1. 硬件 35.4.2. 软件和排版软件 35.5. Credits Bibliography A. Contributed Scripts B. Reference Cards C. A Sed and Awk Micro-Primer C.1. Sed C.2. Awk D. Exit Codes With Special Meanings E. A Detailed Introduction to I/O and I/O Redirection F. Standard Command-Line Options G. Important Files H. Important System Directories I. Localization J. History Commands K. A Sample .bashrc File L. Converting DOS Batch Files to Shell Scripts M. Exercises M.1. Analyzing Scripts M.2. Writing Scripts N. Revision History O. Mirror Sites P. To Do List Q. Copyright 表格清单: 11-1. 作业标识符 30-1. Bash 选项 33-1. 转义序列中数值和彩色的对应 B-1. Special Shell Variables B-2. TEST Operators: Binary Comparison B-3. TEST Operators: Files B-4. Parameter Substitution and Expansion B-5. String Operations B-6. Miscellaneous Constructs C-1. Basic sed operators C-2. Examples of sed operators D-1. "Reserved" Exit Codes L-1. Batch file keywords / variables / operators, and their shell equivalents L-2. DOS commands and their UNIX equivalents N-1. Revision History 例子清单: 2-1. 清除:清除/var/log下的log文件 2-2. 清除:一个改良的清除脚本 2-3. cleanup:一个增强的和广义的删除logfile的脚本 3-1. 代码块和I/O重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件. 4-1. 变量赋值和替换 4-2. 一般的变量赋值 4-3. 变量赋值,一般的和比较特殊的 4-4. 整型还是string? 4-5. 位置参数 4-6. wh,whois节点名字查询 4-7. 使用shift 5-1. echo一些诡异的变量 5-2. 转义符 6-1. exit/exit状态 6-2. 否定一个条件使用! 7-1. 什么情况下为真? 7-2. 几个等效命令test,/usr/bin/test,[],和/usr/bin/[ 7-3. 算数测试使用(( )) 7-4. test死的链接文件 7-5. 数字和字符串比较 7-6. 测试字符串是否为null 7-7. zmore 8-1. 最大公约数 8-2. 使用算术操作符 8-3. 使用&&和||进行混合状态的test 8-4. 数字常量的处理 9-1. $IFS和空白 9-2. 时间输入 9-3. 再来一个时间输入 9-4. Timed read 9-5. 我是root? 9-6. arglist:通过$*和$@列出所有的参数 9-7. 不一致的$*和$@行为 9-8. 当$IFS为空时的$*和$@ 9-9. 下划线变量 9-10. 在一个文本文件的段间插入空行 9-11. 利用修改文件名,来转换图片格式 9-12. 模仿getopt命令 9-13. 提取字符串的一种可选的方法 9-14. 使用参数替换和error messages 9-15. 参数替换和"usage"messages 9-16. 变量长度 9-17. 参数替换中的模式匹配 9-18. 重命名文件扩展名 9-19. 使用模式匹配来分析比较特殊的字符串 9-20. 对字符串的前缀或后缀使用匹配模式 9-21. 使用declare来指定变量的类型 9-22. 间接引用 9-23. 传递一个间接引用给awk 9-24. 产生随机数 9-25. 从一副扑克牌中取出一张随机的牌 9-26. 两个指定值之间的随机数 9-27. 使用随机数来摇一个骰子 9-28. 重新分配随机数种子 9-29. 使用awk产生伪随机数 9-30. C风格的变量处理 10-1. 循环的一个简单例子 10-2. 每个[list]元素带两个参数的for循环 10-3. 文件信息:对包含在变量中的文件列表进行操作 10-4. 在for循环中操作文件 10-5. 在for循环中省略[list] 10-6. 使用命令替换来产生for循环的[list] 10-7. 对于二进制文件的一个grep替换 10-8. 列出系统上的所有用户 10-9. 在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件 10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个C风格的for循环 10-13. 在batch mode中使用efax 10-14. 简单的while循环 10-15. 另一个while循环 10-16. 多条件的while循环 10-17. C风格的while循环 10-18. until循环 10-19. 嵌套循环 10-20. break和continue命令在循环中的效果 10-21. 多层循环的退出 10-22. 多层循环的continue 10-23. 在实际的任务中使用"continue N" 10-24. 使用case 10-25. 使用case来创建菜单 10-26. 使用命令替换来产生case变量 10-27. 简单字符串匹配 10-28. 检查是否是字母输入 10-29. 用select来创建菜单 10-30. 用函数中select结构来创建菜单 11-1. 一个fork出多个自己实例的脚本 11-2. printf 11-3. 使用read,变量分配 11-4. 当使用一个不带变量参数的read命令时,将会发生什么? 11-5. read命令的多行输入 11-6. 检测方向键 11-7. 通过文件重定向来使用read 11-8. 管道输出到read中的问题 11-9. 修改当前的工作目录 11-10. 用"let"命令来作算术操作. 11-11. 显示eval命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本 11-14. 在Perl脚本中使用eval命令来强制变量替换 11-15. 使用set来改变脚本的位置参数 11-16. 重新分配位置参数 11-17. Unset一个变量 11-18. 使用export命令传递一个变量到一个内嵌awk的脚本中 11-19. 使用getopts命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source自身的脚本 11-22. exec的效果 11-23. 一个exec自身的脚本 11-24. 在继续处理之前,等待一个进程的结束 11-25. 一个结束自身的脚本. 12-1. 使用ls命令来创建一个烧录CDR的内容列表 12-2. Hello or Good-bye 12-3. 删除当前目录下文件名中包含一些特殊字符(包括空白)的文件.. 12-4. 通过文件的 inode 号来删除文件 12-5. Logfile: 使用 xargs 来监控系统 log 12-6. 把当前目录下的文件拷贝到另一个文件中 12-7. 通过名字Kill进程 12-8. 使用xargs分析单词出现的频率 12-9. 使用 expr 12-10. 使用 date 命令 12-11. 分析单词出现的频率 12-12. 那个文件是脚本? 12-13. 产生10进制随机数 12-14. 使用 tail 命令来监控系统log 12-15. 在一个脚本中模仿 "grep" 的行为 12-16. 在1913年的韦氏词典中查找定义 12-17. 检查列表中单词的正确性 12-18. 转换大写: 把一个文件的内容全部转换为大写. 12-19. 转换小写: 将当前目录下的所有文全部转换为小写. 12-20. Du: DOS 到 UNIX 文本文件的转换. 12-21. rot13: rot13, 弱智加密. 12-22. Generating "Crypto-Quote" Puzzles 12-23. 格式化文件列表. 12-24. 使用 column 来格式化目录列表 12-25. nl: 一个自己计算行号的脚本. 12-26. manview: 查看格式化的man页 12-27. 使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2个文件. 12-33. basename 和 dirname 12-34. 检查文件完整性 12-35. Uudecod 编码后的文件 12-36. 查找滥用的连接来报告垃圾邮件发送者 12-37. 分析一个垃圾邮件域 12-38. 获得一份股票报价 12-39. 更新 Fedora Core 4 12-40. 使用 ssh 12-41. 一个可以mail自己的脚本 12-42. 按月偿还贷款 12-43. 数制转换 12-44. 使用 "here document" 来调用 bc 12-45. 计算圆周率 12-46. 将10进制数字转换为16进制数字 12-47. 因子分解 12-48. 计算直角三角形的斜边 12-49. 使用 seq 来产生循环参数 12-50. 字母统计 12-51. 使用getopt来分析命令行选项 12-52. 一个拷贝自身的脚本 12-53. 练习dd 12-54. 记录按键 12-55. 安全的删除一个文件 12-56. 文件名产生器 12-57. 将米转换为英里 12-58. 使用 m4 13-1. 设置一个新密码 13-2. 设置一个擦除字符 13-3. 关掉终端对于密码的echo 13-4. 按键检测 13-5. Checking a remote server for identd 13-6. pidof 帮助杀掉一个进程 13-7. 检查一个CD镜像 13-8. 在一个文件中创建文件系统 13-9. 添加一个新的硬盘驱动器 13-10. 使用umask来将输出文件隐藏起来 13-11. killall, 来自于 /etc/rc.d/init.d 14-1. 愚蠢的脚本策略 14-2. 从循环的输出中产生一个变量 14-3. 找anagram(回文构词法, 可以将一个有意义的单词, 变换为1个或多个有意义的单词, 但是还是原来的子母集合) 16-1. 使用exec重定向标准输入 16-2. 使用exec来重定向stdout 16-3. 使用exec在同一脚本中重定向stdin和stdout 16-4. 避免子shell 16-5. while循环的重定向 16-6. 另一种while循环的重定向 16-7. until循环重定向 16-8. for循环重定向 16-9. for循环重定向 loop (将标准输入和标准输出都重定向了) 16-10. 重定向if/then测试结构 16-11. 用于上面例子的"names.data"数据文件 16-12. 记录日志事件 17-1. 广播: 发送消息给每个登录上的用户 17-2. 仿造文件: 创建一个两行的仿造文件 17-3. 使用cat的多行消息 17-4. 带有抑制tab功能的多行消息 17-5. 使用参数替换的here document 17-6. 上传一个文件对到"Sunsite"的incoming目录 17-7. 关闭参数替换 17-8. 一个产生另外一个脚本的脚本 17-9. Here documents与函数 17-10. "匿名" here Document 17-11. 注释掉一段代码块 17-12. 一个自文档化(self-documenting)的脚本 17-13. 在一个文件的开头添加文本 20-1. 子shell中的变量作用域 20-2. 列出用户的配置文件 20-3. 在子shell里进行串行处理 21-1. 在受限的情况下运行脚本 23-1. 简单函数 23-2. 带着参数的函数 23-3. 函数和被传给脚本的命令行参数 23-4. 传递间接引用给函数 23-5. 解除传递给函数的参数引用 23-6. 再次尝试解除传递给函数的参数引用 23-7. 两个数中的最大者 23-8. 把数字转化成罗马数字 23-9. 测试函数最大的返回值 23-10. 比较两个大整数 23-11. 用户名的真实名 23-12. 局部变量的可见范围 23-13. 用局部变量来递归 23-14. 汉诺塔 24-1. 脚本中的别名 24-2. unalias: 设置和删除别名 25-1. 使用"与列表(and list)"来测试命令行参数 25-2. 用"与列表"的另一个命令行参数测试 25-3. "或列表"和"与列表"的结合使用 26-1. 简单的数组用法 26-2. 格式化一首诗 26-3. 多种数组操作 26-4. 用于数组的字符串操作符 26-5. 将脚本的内容传给数组 26-6. 一些数组专用的工具 26-7. 关于空数组和空数组元素 26-8. 初始化数组 26-9. 复制和连接数组 26-10. 关于连接数组的更多信息 26-11. 一位老朋友: 冒泡排序 26-12. 内嵌数组和间接引用 26-13. 复杂数组应用: 埃拉托色尼素数筛子 26-14. 模拟下推的堆栈 26-15. 复杂的数组应用: 列出一种怪异的数学序列 26-16. 模拟二维数组,并使它倾斜 27-1. 利用/dev/tcp 来检修故障 27-2. 搜索与一个PID相关的进程 27-3. 网络连接状态 28-1. 隐藏cookie而不再使用 28-2. 用/dev/zero创建一个交换临时文件 28-3. 创建ramdisk 29-1. 一个错误的脚本 29-2. 丢失关键字(keyword) 29-3. 另一个错误脚本 29-4. 用"assert"测试条件 29-5. 捕捉 exit 29-6. 在Control-C后清除垃圾 29-7. 跟踪变量 29-8. 运行多进程 (在多处理器的机器里) 31-1. 数字和字符串比较是不相等同的 31-2. 子SHELL缺陷 31-3. 把echo的输出用管道输送给read命令 33-1. shell 包装 33-2. 稍微复杂一些的shell包装 33-3. 写到日志文件的shell包装 33-4. 包装awk的脚本 33-5. 另一个包装awk的脚本 33-6. 把Perl嵌入Bash脚本 33-7. Bash 和 Perl 脚本联合使用 33-8. 递归调用自己本身的(无用)脚本 33-9. 递归调用自己本身的(有用)脚本 33-10. 另一个递归调用自己本身的(有用)脚本 33-11. 一个 "彩色的" 地址资料库 33-12. 画盒子 33-13. 显示彩色文本 33-14. "赛马" 游戏 33-15. 返回值技巧 33-16. 整型还是string? 33-17. 传递和返回数组 33-18. anagrams游戏 33-19. 在shell脚本中调用的窗口部件 34-1. 字符串扩展 34-2. 间接变量引用 - 新方法 34-3. 使用间接变量引用的简单数据库应用 34-4. 用数组和其他的小技巧来处理四人随机打牌 A-1. mailformat: Formatting an e-mail message A-2. rn: A simple-minded file rename utility A-3. blank-rename: renames filenames containing blanks A-4. encryptedpw: Uploading to an ftp site, using a locally encrypted password A-5. copy-cd: Copying a data CD A-6. Collatz series A-7. days-between: Calculate number of days between two dates A-8. Make a "dictionary" A-9. Soundex conversion A-10. "Game of Life" A-11. Data file for "Game of Life" A-12. behead: Removing mail and news message headers A-13. ftpget: Downloading files via ftp A-14. password: Generating random 8-character passwords A-15. fifo: Making daily backups, using named pipes A-16. Generating prime numbers using the modulo operator A-17. tree: Displaying a directory tree A-18. string functions: C-like string functions A-19. Directory information A-20. Object-oriented database A-21. Library of hash functions A-22. Colorizing text using hash functions A-23. Mounting USB keychain storage devices A-24. Preserving weblogs A-25. Protecting literal strings A-26. Unprotecting literal strings A-27. Spammer Identification A-28. Spammer Hunt A-29. Making wget easier to use A-30. A "podcasting" script A-31. Basics Reviewed A-32. An expanded cd command C-1. Counting Letter Occurrences K-1. Sample .bashrc file L-1. VIEWDATA.BAT: DOS Batch File L-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT P-1. Print the server environment
目 录 第1 章 简介(1) 1.1 简介 1.1.1 简史 1.1.2 创始之初 1.1.3 繁衍 1.1.4 BSD 1.1.5 System V 1.1.6 商业化 1.1.7 Mach 1.1.8 标准 1.1.9 OSF 和UI 1.1.10 SVR4 及其之后 1.2 演变的动力 1.2.1 功能 1.2.2 网络 1.2.3 性能 1.2.4 硬件变化 1.2.5 改进质量 1.2.6 模式变化 1.2.7 其他应用领域 1.2.8 简洁就是美 1.2.9 灵活性 1.3 回顾与展望 1.3.1 UNIX 好在哪里 1.3.2 UNIX 的误区在哪儿 1.4 本书的范围 1.5 参考文献 第2 章 进程与内核(17) 2.1 简介 2.2 模式.空间和上下文 2.3 进程抽象 2.3.1 进程状态 2.3.2 进程上下文 2.3.3 用户凭证 2.3.4 u 区和proc 结构 2.4 内核态下运行 2.4.1 系统调用接口 2.4.2 中断处理 2.5 同步 2.5.1 阻塞操作 2.5.2 中断 2.5.3 多处理器 2.6 进程调度 2.7 信号 2.8 新进程和程序 2.8.1 fork 和exec 2.8.2 进程创建 2.8.3 fork 优化 2.8.4 执行一个新程序 2.8.5 进程终止 2.8.6 等待进程终止 2.8.7 僵尸(Zombie)进程 2.9 小结 2.10 练习 2.11 参考文献 第3 章 线程和轻量级进程(41) 3.1 简介 3.1.1 动机 3.1.2 多线程和多处理器 3.1.3 并发和并行 3.2 基本抽象概念 3.2.1 内核线程 3.2.2 轻量级进程 3.2.3 用户线程 3.3 轻量级进程设计——要考虑的问题 3.3.1 fork 的语义 3.3.2 其他的系统调用 3.3.3 信号传递和处理 3.3.4 可视性 3.3.5 堆栈增长 3.4 用户级线程库 3.4.1 编程接口 3.4.2 线程库的实现 3.5 调度器调用 3.6 Solaris 和 SVR4 的多线程处理 3.6.1 内核线程 3.6.2 轻量级进程的实现 3.6.3 用户线程 3.6.4 用户线程的实现 3.6.5 中断处理 3.6.6 系统调用处理 3.7 Mach 中的线程 3.7.1 Mach 的抽象概念——任务和线程 3.7.2 Mach 的C-threads 3.8 Digital UNIX 3.8.1 UNIX 接口 3.8.2 系统调用和信号 3.8.3 pthreads 线程库 3.9 Mach 3.0 的续体 3.9.1 编程模型 3.9.2 使用续体 3.9.3 优化 3.9.4 分析 3.10 小结 3.11 练习 3.12 参考文献 第4 章 信号和会话管理(72) 4.1 简介 4.2 信号生成和处理 4.2.1 信号处理 4.2.2 信号生成 4.2.3 典型情景 4.2.4 睡眠和信号 4·3 不可靠信号 4.4 可靠的信号 4.4.1 主要特性 4.4.2 SVR3 的实现 4.4.3 BSD 信号管理 4.5 SVR4 信号机制 4.6 信号机制的实现 4.6.1 信号生成 4.6.2 信号传递和处理 4.7 异常 4.8 Mach 中的异常处理 4.8.1 异常端口 4.8.2 错误处理 4.8.3 调试器的交互 4.8.4 分析 4.9 进程组和终端管理 4.9.1 基本概念 4.9.2 SVR3 模型 4.9.3 局限性 4.9.4 4.3BSD 中的进程组和终端 4.9.5 缺点 4.10 SVR4 会话的体系结构 4.10.1 目的(动机) 4.10.2 会话和进程组 4.10.3 数据结构 4.10.4 控制终端 4.10.5 4.4BSD 中会话的实现 4.11 小结 4.12 练习 4.13 参考文献 第5 章 进程调度(98) 5.1 简介 5.2 时钟中断处理 5.2.1 调出链表 5.2.2 报警 5.3 调度器的目标 5.4 传统的UNIX 调度 5.4.1 进程优先级 5.4.2 调度器的实现 5.4.3 运行队列管理 5.4.4 分析 5.5 SVR4 的调度器 5.5.1 类无关层 5.5.2 调度类的接口 5.5.3 分时类 5.5.4 实时类 5.5.5 系统调用priocntl 5.5.6 分析 5.6 Solaris2.x 调度的改善 5.6.1 抢占式内核 5.6.2 多处理器的支持 5.6.3 隐式调度 5.6.4 优先级逆转 5.6.5 优先级继承的实现 5.6.6 优先继承的局限性 5.6.7 Turnstiles 5.6.8 分析 5.7 mach 中的调度 5.7.1 多处理器的支持 5.8 Digital UNIX 的实时调度器 5.8.1 多处理器支持 5.9 其他的一些调度实现 5.9.1 fair share 调度 5.9.2 最终期限驱动调度 5.9.3 三级(Three-Level)调度器 5.10 小结 5.11 练习 5.12 参考文献 第6 章 进程间通信(130) 6.1 简介 6.2 通用IPC 方法 6.2.1 信号 6.2.2 管道 6.2.3 SVR4 的管道 6.2.4 进程跟踪 6.3 System V 的进程间通信 6.3.1 公共元素 6.3.2 信号量 6.3.3 消息队列 6.3.4 共享内存 6.3.5 讨论 6.4 Mach IPC 6.4.1 基本概念 6.5 消息 6.5.1 消息的数据结构 6.5.2 消息传递接口 6.6 端口 6.6.1 端口名字空间 6.6.2 端口数据结构 6.6.3 端口变换 6.7 消息传递 6.7.1 端口权力的传递 6.7.2 脱机内存 6.7.3 控制流 6.7.4 通知 6.8 端口操作 6.8.1 释放一个端口 6.8.2 备份端口 6.8.3 端口集合 6.8.4 端口的添加 6.9 扩展性 6.10 Mach 3.0 的改进 6.10.1 一次发送权 6.10.2 Mach 3.0 的通知 6.10.3 发送权的用户引用记数 6.11 讨论 6.12 小结 6.13 练习 6.14 参考文献 第7 章 同步和多处理器(164) 7.1 简介 7.2 传统UNIX 内核中的同步 7.2.1 中断屏蔽 7.2.2 睡眠和唤醒 7.2.3 传统方法的局限性 7.3 多处理器系统 7.3.1 内存模型 7.3.2 同步支持 7.3.3 软件体系结构 7.4 多处理器同步问题 7.4.1 唤醒丢失问题 7.4.2 巨群问题 7.5 信号灯 7.5.1 提供互斥访问的信号灯 7.5.2 使用的信号灯的事件等待 7.5.3 用于控制可计数资源的信号灯 7.5.4 信号灯的缺点 7.5.5 护卫 7.6 自旋锁 7.6.1 自旋锁的使用 7.7 条件变量 7.7.1 实现问题 7.7.2 事件 7.7.3 阻塞锁 7.8 读写锁 7.8.1 设计考虑 7.8.2 实现 7.9 引用计数 7.10 其他考虑 7.10.1 死锁避免 7.10.2 递归锁 7.10.3 阻塞还是自旋 7.10.4 锁什么 7.10.5 粒度和持续时间 7.11 例子分析 7.11.1 SVR 4.2/MP 7.11.2 Digital UNIX 7.11.3 其他实现 7.12 小结 7.13 练习 7.14 参考文献 第8 章 文件系统接口和框架(191) 8.1 简介 8.2 文件的用户接口 8.2.1 文件和目录 8.2.2 文件属性 8.2.3 文件描述符 8.2.4 文件1/O 8.2.5 分散-聚集I/O(Scatter-Garther I/O) 8.2.6 文件加锁 8.3 文件系统 8.3.1 逻辑磁盘 8.4 特殊文件 8.4.1 符号链接 8.4.2 管道和FIFO 8.5 文件系统框架 8.6 vnode/vfs 体系结构 8.6.1 目标 8.6.2 设备 1 门的经验 8.6.3 vnode/vfs 接口概述 8.7 实现概述 8.7.1 目标 8.7.2 v 节点和打开文件 8.7.3 v 节点 8.7.4 v 节点引用计数 8.7.5 vfs 对象 8.8 文件系统相关对象 8.8.1 每个文件的私有数据 8.8.2 vnodeops 向量 8.8.3 vfs 层中的文件系统相关部分 8.9 安装一个文件系统 8.9.1 虚拟文件系统转换 8.9.2 mount 的实现 8.9.3 VFS-MOUNT 处理 8.10 对文件的操作 8.10.1 路径名遍历 8.10.2 目录查找缓存 8.10.3 VOP_LOOKUP 操作 8.10.4 打开文件 8.10.5 文件I/O 8.10.6 文件属性 8.10.7 用户凭证 8.11 分析 8.11.1 SVR4 实现的缺点 8.11.2 4.4BSD 模型 8.11.3 OSF/1 方法 8.12 小结 8.13 练习 8.14 参考文献 第9 章 文件系统实现(227) 9.1 简介 9.2 System V 文件系统(s5fs) 9.2.1 目录 9.2.2 i 节点 9.2.3 超级块 9.3 s5fs 内核组织 9.3.1 内存i 节点 9.3.2 i 节点查找 9.3.3 文件I/O 9.3.4 i 节点的分配与回收 9.4 对s5fs 的分析 9.5 伯克利快速文件系统(FFS) 9.6 硬盘结构 9.7 磁盘组织 9.7.1 块和碎片 9.7.2 分配策略 9.8 FFS 的增强功能 9.9 分析 9.10 临时文件系统 9.10.1 内存文件系统 9.10.2 tmpfs 文件系统 9.11 特殊目的文件系统 9.11.1 specfs 文件系统 9.11.2 /proc 文件系统 9.11.3 处理器文件系统 9.11.4 半透明文件系统 9.12 以往的磁盘缓存 9.12.1 基本操作 9.12.2 缓冲区头结构 9.12.3 优点 9.12.4 缺点 9.12.5 保证文件系统的一致性 9.13 小结 9.14 练习 9.15 参考文献 第10 章 分布式文件系统(255) 10.1 简介 1O.2 分布式文件系统的一般特征 10.2.1 设计考虑 10.3 网络文件系统(NFS) 10.3.1 用户透视 10.3.2 设计日标 10.3.3 NFS 组成 10.3.4 无状态 10.4 协议族 10.4.1 扩展数据表示(XDR) 10.4.2 远程过程调用(RPC) 10.5 NFS 实现 10.5.1 控制流 10.5.2 文件句柄 l0.5.3 mount 操作 10.5.4 路径名查找 10.6 UNIX 语义 10.6.1 打开文件权限 10.6.2 删除打开文件 l0.6.3 读和写 10.7 NFS 性能 10.7.1 性能瓶颈 10.7.2 客户端高速缓存 10.7.3 延迟写 10.7.4 重传高速缓存 10.8 专用NFS 服务器 10.8.1 Auspex 功能性多处理器结构 10.8.2 IBM 的HA-NFS 服务器 10.9 NFS 安全性 10.9.1 NFS 访问控制 10.9.2 UID 重新映射 10.9.3 root 重新映射 10.10 NFSv3 10.11 远程文件共亨(RFS)文件系统 10.12 RFS 结构 10.12.1 远程消息协议 10.12.2 有状态操作 10.13 RFS 实现 10.13.1 远程安装 10.13.2 RFS 客户和服务器 10.13.3 崩溃恢复 10.13.4 其他问题 10.14 客户端高速缓存 10.14.1 高速缓存一致性 10.15 Andrew 文件系统 10.15.1 可扩展的结构 10.15.2 存储和名字空间组织 10.15.3 会话语义 10.16 AFS 实现 10.16.1 缓存以及一致性 10.16.2 路径名查找 10.16.3 安全 10.17 AFS 的缺陷 10.18 DCE 分布式文件系统(DCE DFS) 10.18.1 DFS 体系结构 10.18.2 高速缓冲区一致性 10.18.3 令牌管理器 10.18.4 其他DFS 服务 10.18.5 分析 10.19 小结 10.20 练习 10.21 参考文献 第11 章 高级文件系统(298) 11.1 简介 11.2 传统文件系统的局限 11.2.1 FFS 磁盘布局 11.2.2 写的主导性 11.2.3 元数据更新 11.2.4 崩溃恢复 11.3 文件系统成簇(Sun-FFS) 11.4 日志方法 11.4.1 基本特征 11.5 日志结构文件系统 11.6 4.4BSD 日志文件系统 11.6.1 写日志 11.6.2 数据检索 11.6.3 崩溃恢复 11.6.4 清除进程 11.6.5 分析 11.7 元数据日志 11.7.1 正常操作 11.7.2 日志的一致 11.7.3 崩溃恢复 11.7.4 分析 11.8 Episode 文件系统 11.8.1 基本抽象 11.8.2 结构 11.8.3 记日志 11.8.4 其他特性 11.9 监视器(watchdog) 11.9.1 目录监视器 11.9.2 消息通道 11.9.3 应用 11.10 4.4BSD 端口文件系统 11.10.1 使用端曰(portals) 11.11 堆栈式文件系统层 11.11.1 框架和接口 11.11.2 Sun Soft 原型 11.12 4.4BSD 文件系统接口 11.12.1 Nullfs 和Union Mount 文件系统 11.13 小结 11.14 练习 11.15 参考文献 第12 章 内核内存管理(328) 12.1 简介 12.2 功能需求 12.2.1 评估标准 12.3 资源映射图分配器 12.3.1 分析 12.4 简单2 次幂空闲表 12.4.1 分析 12.5 McKusick-Karels 分配器 12.5.1 分析 12.6 伙伴系统 12.6.1 分析 12.7 SVR4 Lazy 伙伴算法 12.7.1 Lazy 合并 12.7.2 SVR4 实现细节 12.8 Mach/1 的zone 分配器 12.8.1 垃圾收集 12.8.2 分析 12.9 多处理器的分层分配器 12.9.1 分析 12.10 Solaris 2.4 的Slab 分配器 12.10.1 对象复用 12.10.2 硬件Cache 利用率 12.10.3 分配器footprint 12.10.4 设计与接口 12.10.5 实现 12.10.6 分析 12.11 小结 12.12 练习 12.13 参考文献 第13 章 虚存(352) 13.1 简介 13.1.1 内存管理的石器时代 13.2 分页 13.2.1 功能需求 13.2.2 虚拟地址空间 13.2.3 页面初始访问 13.2.4 交换区 13.2.5 转换映射图 13.2.6 页面替换策略 13.3 硬件需求 13.3.1 MMU 缓存 13.3.Z Intel 80x86 13.3.3 IBM RS/6000 13.3.4 MIPS R3000 13.4 4.3BSBSD 实例研究 13.4.1 物理内存 13.4.2 地址空间 13.4.3 页面在哪里 13.4.4 交换区 13.5 4.3BSD 内存管理操作 13.5.1 创建进程 13.5.2 页面失效处理 13.5.3 空闲页面链表 13.5.4 交换 13.6 分析 13.7 练习 13.8 文献 第14 章 SVR4 VM 体系结构(382) 14.1 动机 14.2 内存映射文件 14.2.1 mmap 及相关系统用 14.3 VM 设计原理 14.4 基本抽象概念 14.4.1 物理内存 14.4.2 地址空间 14.4.3 地址映射 14.4.4 匿名页面 14.4.5 硬件地址转换 14.5 段驱动程序 14.5.1 seg-vn 14.5.2 seg-map 14.5.3 seg-dev 14.5.4 seg-kmem 14.5.5 seg-kp 14.6 交换层 14.7 VM 操作 14.7.1 创建一个新映射 14.7.2 匿名页面处理 14.7.3 创建进程 14.7.4 共享匿名页面 14.7.5 页面失效处理 14.7.6 共享内存 14.7.7 其他部件 14.8 与v 节点子系统的交互 14.8.1 v 节点接口变化 14.8.2 统一的文件访问 14.8.3 其他问题 14.9 Solaris 中的虚拟交换空间 14.9.1 扩展交换空间 14.9.2 虚交换管理 14.9.3 讨论 14.10 分析 14.11 性能改进 14.11.1 高失效率原因 14.11.2 SVR4 对SunOS VM 实现的改进 14.11.3 结果与讨论 14.12 小结 14.13 练习 14.14 参考文献 第15 章 进一步关于内存管理的主题(413) 15.1 简介 15.2 Mach 的内存管理设计 15.2.1 设计目标 15.2.2 编程接口 15.2.3 基本抽象概念 15.3 共享内存设施 15.3.1 copy-on-write 共享 15.3.2 读写共享 15.4 内存对象和Pager 15.4.1 内存对象初始化 15.4.2 内核与pager 间的接口 15.4.3 内核与pager 交互 15.5 外部pager 和内部pager 15.5.1 一个网络共享内存服务器 15.6 页面替换 15.7 分析 15.8 4.4BSD 的内存管理 15.9 快表(TLB)一致性 15.9.1 单处理机上的TLB 一致性 15.9.2 多处理机问题 15.10 Mach 的TLB 击落算法 15.10.1 同步和死锁避免 15.10.2 讨论 15.11 SVR4 和SVR4.2 UNIX 中的TLB 一致性 15.11.1 SVR4/MP 15.11.2 SVR4.2/MP 15.11.3 Lazy 击落算法 15.11.4 立即击落 15.11.5 讨论 15.12 其他TLB 一致性算法 15.13 虚地址缓存 l5.13.1 映射变化 15.13.2 地址别名 15.13.3 DMA 操作 15.13.4 维护缓存一致性 15.13.5 分析 15.14 练习 15.15 参考文献 第16 章 设备驱动程序I/O(446) 16.1 简介 16.2 概述 16.2.1 硬件配置 16.2.2 设备中断 16.3 设备驱动程序框架 16.3.1 设备和驱动程序分类 16.3.2 调用驱动程序代码 16.3.3 设备开关表 16.3.4 驱动程序入口点 16.4 I/O 子系统 16.4.1 主、次设备号 16.4.2 设备文件 16.4.3 specfs 文件系统 16.4.4 公共snode 16.4.5 设备克隆 16.4.6 字符设备I/O 16.5 poll 系统调用 16.5.1 poll 的实现 16.5.2 4.3BSD select 系统调用 16.6 块I/O 16.6.1 buf 结构 16.6.2 与v 节点的交互 16.6.3 设备访问方法 16.6.4 到块设备的raw I/O 16.7 DDI/DKI 说明 16.7.1 建议 16.7.2 第三部分函数 16.7.3 其他部分 16.8 新的SVR4 版本 16.8.1 多处理器可靠驱动程序 16.8.2 SVR4.1/ES 的变化 16.8.3 动态加载和卸载 16.9 发展趋势 16.10 小结 16.11 练习 16.12 参考文献 第17 章 流(477) 17.1 目的 17.2 概述 17.3 消息和队列 17.3.1 消息 17.3.2 虚拟拷贝 17.3.3 消息类型 17.3.4 队列和模块 17.4 流I/O 17.4.1 STREAMS 调度程序 17.4.2 优先带(Priority Bands) 17.4.3 流量控制 17.4.4 驱动程序尾 17.4.5 流头 17.5 配置和设置 17.5.1 配置一个模块或驱动程序 17.5.2 打开流 17.5.3 插入(Pushing)模块 17.5.1 克隆设备 17.6 STREAMS ioctl 17.6.1 STR ioctl 处理 17.6.2 透明ioctl 17.7 内存分配 17.7.1 扩展STREAMS 缓冲区 17.8 多路复用 17.8.1 上部多路复用器 17.8.2 下部多路复用器 17.8.3 链接流 17.8.4 数据流 17.8.5 普通链接和持久链接 17.9 FIFO 和管道 17.9.1 STREAMS FIFO 17.9.2 STREAMS 管道 17.10 网络接口 17.10.1 传输供应者接口(TPI) 17.10.2 传输层接口(TLI) 17.10.3 sockets 17.10.4 SVR4 socket 实现 17.11 小结 17.12 练习 17.13 参考文献
目录 ++++ 第一部分. 热身 1. 为什么使用shell 编程 2. 带着一个Sha-Bang 出发(Sha-Bang 指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash 变量是不分类型的 4.4. 特殊的变量类型 5. 引用(翻译的可能有问题,特指引号) 5.1. 引用变量 5.2. 转义(\) 6. 退出和退出状态 7. Tests 7.1. Test 结构 7.2. 文件测试操作 7.3. 其他比较操作 7.4. 嵌套的if/then 条件test 7.5. 检查你的test 知识 8. 操作符和相关的主题 8.1. 操作符 8.2. 数字常量 第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare 或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环和分支 10.1. 循环 10.2. 嵌套循环 10.3. 循环控制 10.4. 测试与分支(case 和select 结构) 11. 内部命令与内建 11.1. 作业控制命令 12. 外部过滤器,程序和命令 12.1. 基本命令 12.2. 复杂命令 12.3. 时间/日期 命令 12.4. 文本处理命令 12.5. 文件与归档命令 12.6. 通讯命令 12.7. 终端控制命令 12.8. 数学计算命令 12.9. 混杂命令 13. 系统与管理命令 13.1. 分析一个系统脚本 14. 命令替换 15. 算术扩展 16. I/O 重定向 16.1. 使用exec 16.2. 代码块的重定向 16.3. 应用 17. Here Documents 17.1. Here Strings 18. 休息时间 Part 4. 高级 19. 正则表达式 19.1. 一个简要的正则表达式介绍 19.2. 通配 20. 子shell(Subshells) 21. 受限shell(Restricted Shells) 22. 进程替换 23. 函数 23.1. 复杂函数和函数复杂性 23.2. 局部变量 23.3. 不使用局部变量的递归 24. 别名(Aliases) 25. 列表结构 26. 数组 27. /dev 和 /proc 27.1. /dev 27.2. /proc 28. 关于Zeros 和Nulls 29. 调试 30. 选项 31. Gotchas 32. 脚本编程风格 32.1. 非官方的Shell 脚本风格 33. 杂项 33.1. 交互式和非交互式的shells 和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 33.8.1. 被感染的脚本 33.8.2. 隐藏Shell 脚本源码 33.9. 移植话题 33.10. 在Windows 下进行Shell 编程 34. Bash, 版本 2 和 3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 哪里可以取得帮助? 35.4. 制作这本书的工具 35.4.1. 硬件 35.4.2. 软件和排版软件 35.5. Credits Bibliography A. Contributed Scripts B. Reference Cards C. A Sed and Awk Micro-Primer C.1. Sed C.2. Awk D. Exit Codes With Special Meanings E. A Detailed Introduction to I/O and I/O Redirection F. Standard Command-Line Options G. Important Files H. Important System Directories I. Localization J. History Commands K. A Sample .bashrc File L. Converting DOS Batch Files to Shell Scripts M. Exercises M.1. Analyzing Scripts M.2. Writing Scripts N. Revision History O. Mirror Sites P. To Do List Q. Copyright 表格清单: 11-1. 作业标识符 30-1. Bash 选项 33-1. 转义序列中数值和彩色的对应 B-1. Special Shell Variables B-2. TEST Operators: Binary Comparison B-3. TEST Operators: Files B-4. Parameter Substitution and Expansion B-5. String Operations B-6. Miscellaneous Constructs C-1. Basic sed operators C-2. Examples of sed operators D-1. "Reserved" Exit Codes L-1. Batch file keywords / variables / operators, and their shell equivalents L-2. DOS commands and their UNIX equivalents N-1. Revision History 例子清单: 2-1. 清除:清除/var/log 下的log 文件 2-2. 清除:一个改良的清除脚本 2-3. cleanup:一个增强的和广义的删除logfile 的脚本 3-1. 代码块和I/O 重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件. 4-1. 变量赋值和替换 4-2. 一般的变量赋值 4-3. 变量赋值,一般的和比较特殊的 4-4. 整型还是string? 4-5. 位置参数 4-6. wh,whois 节点名字查询 4-7. 使用shift 5-1. echo 一些诡异的变量 5-2. 转义符 6-1. exit/exit 状态 6-2. 否定一个条件使用! 7-1. 什么情况下为真? 7-2. 几个等效命令test,/usr/bin/test,[],和/usr/bin/[ 7-3. 算数测试使用(( )) 7-4. test 死的链接文件 7-5. 数字和字符串比较 7-6. 测试字符串是否为null 7-7. zmore 8-1. 最大公约数 8-2. 使用算术操作符 8-3. 使用&&和||进行混合状态的test 8-4. 数字常量的处理 9-1. $IFS 和空白 9-2. 时间输入 9-3. 再来一个时间输入 9-4. Timed read 9-5. 我是root? 9-6. arglist:通过$*和$@列出所有的参数 9-7. 不一致的$*和$@行为 9-8. 当$IFS 为空时的$*和$@ 9-9. 下划线变量 9-10. 在一个文本文件的段间插入空行 9-11. 利用修改文件名,来转换图片格式 9-12. 模仿getopt 命令 9-13. 提取字符串的一种可选的方法 9-14. 使用参数替换和error messages 9-15. 参数替换和"usage"messages 9-16. 变量长度 9-17. 参数替换中的模式匹配 9-18. 重命名文件扩展名 9-19. 使用模式匹配来分析比较特殊的字符串 9-20. 对字符串的前缀或后缀使用匹配模式 9-21. 使用declare 来指定变量的类型 9-22. 间接引用 9-23. 传递一个间接引用给awk 9-24. 产生随机数 9-25. 从一副扑克牌中取出一张随机的牌 9-26. 两个指定值之间的随机数 9-27. 使用随机数来摇一个骰子 9-28. 重新分配随机数种子 9-29. 使用awk 产生伪随机数 9-30. C 风格的变量处理 10-1. 循环的一个简单例子 10-2. 每个[list]元素带两个参数的for 循环 10-3. 文件信息:对包含在变量中的文件列表进行操作 10-4. 在for 循环中操作文件 10-5. 在for 循环中省略[list] 10-6. 使用命令替换来产生for 循环的[list] 10-7. 对于二进制文件的一个grep 替换 10-8. 列出系统上的所有用户 10-9. 在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件 10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个C 风格的for 循环 10-13. 在batch mode 中使用efax 10-14. 简单的while 循环 10-15. 另一个while 循环 10-16. 多条件的while 循环 10-17. C 风格的while 循环 10-18. until 循环 10-19. 嵌套循环 10-20. break 和continue 命令在循环中的效果 10-21. 多层循环的退出 10-22. 多层循环的continue 10-23. 在实际的任务中使用"continue N" 10-24. 使用case 10-25. 使用case 来创建菜单 10-26. 使用命令替换来产生case 变量 10-27. 简单字符串匹配 10-28. 检查是否是字母输入 10-29. 用select 来创建菜单 10-30. 用函数中select 结构来创建菜单 11-1. 一个fork 出多个自己实例的脚本 11-2. printf 11-3. 使用read,变量分配 11-4. 当使用一个不带变量参数的read 命令时,将会发生什么? 11-5. read 命令的多行输入 11-6. 检测方向键 11-7. 通过文件重定向来使用read 11-8. 管道输出到read 中的问题 11-9. 修改当前的工作目录 11-10. 用"let"命令来作算术操作. 11-11. 显示eval 命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本 11-14. 在Perl 脚本中使用eval 命令来强制变量替换 11-15. 使用set 来改变脚本的位置参数 11-16. 重新分配位置参数 11-17. Unset 一个变量 11-18. 使用export 命令传递一个变量到一个内嵌awk 的脚本中 11-19. 使用getopts 命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source 自身的脚本 11-22. exec 的效果 11-23. 一个exec 自身的脚本 11-24. 在继续处理之前,等待一个进程的结束 11-25. 一个结束自身的脚本. 12-1. 使用ls 命令来创建一个烧录CDR 的内容列表 12-2. Hello or Good-bye 12-3. 删除当前目录下文件名中包含一些特殊字符(包括空白)的文件.. 12-4. 通过文件的 inode 号来删除文件 12-5. Logfile: 使用 xargs 来监控系统 log 12-6. 把当前目录下的文件拷贝到另一个文件中 12-7. 通过名字Kill 进程 12-8. 使用xargs 分析单词出现的频率 12-9. 使用 expr 12-10. 使用 date 命令 12-11. 分析单词出现的频率 12-12. 那个文件是脚本? 12-13. 产生10 进制随机数 12-14. 使用 tail 命令来监控系统log 12-15. 在一个脚本中模仿 "grep" 的行为 12-16. 在1913 年的韦氏词典中查找定义 12-17. 检查列表中单词的正确性 12-18. 转换大写: 把一个文件的内容全部转换为大写. 12-19. 转换小写: 将当前目录下的所有文全部转换为小写. 12-20. Du: DOS 到 UNIX 文本文件的转换. 12-21. rot13: rot13, 弱智加密. 12-22. Generating "Crypto-Quote" Puzzles 12-23. 格式化文件列表. 12-24. 使用 column 来格式化目录列表 12-25. nl: 一个自己计算行号的脚本. 12-26. manview: 查看格式化的man 页 12-27. 使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2 个文件. 12-33. basename 和 dirname 12-34. 检查文件完整性 12-35. Uudecod 编码后的文件 12-36. 查找滥用的连接来报告垃圾邮件发送者 12-37. 分析一个垃圾邮件域 12-38. 获得一份股票报价 12-39. 更新 Fedora Core 4 12-40. 使用 ssh 12-41. 一个可以mail 自己的脚本 12-42. 按月偿还贷款 12-43. 数制转换 12-44. 使用 "here document" 来调用 bc 12-45. 计算圆周率 12-46. 将10 进制数字转换为16 进制数字 12-47. 因子分解 12-48. 计算直角三角形的斜边 12-49. 使用 seq 来产生循环参数 12-50. 字母统计 12-51. 使用getopt 来分析命令行选项 12-52. 一个拷贝自身的脚本 12-53. 练习dd 12-54. 记录按键 12-55. 安全的删除一个文件 12-56. 文件名产生器 12-57. 将米转换为英里 12-58. 使用 m4 13-1. 设置一个新密码 13-2. 设置一个擦除字符 13-3. 关掉终端对于密码的echo 13-4. 按键检测 13-5. Checking a remote server for identd 13-6. pidof 帮助杀掉一个进程 13-7. 检查一个CD 镜像 13-8. 在一个文件中创建文件系统 13-9. 添加一个新的硬盘驱动器 13-10. 使用umask 来将输出文件隐藏起来 13-11. killall, 来自于 /etc/rc.d/init.d 14-1. 愚蠢的脚本策略 14-2. 从循环的输出中产生一个变量 14-3. 找anagram(回文构词法, 可以将一个有意义的单词, 变换为1 个或多个有意义的单词, 但 是还是原来的子母集合) 16-1. 使用exec 重定向标准输入 16-2. 使用exec 来重定向stdout 16-3. 使用exec 在同一脚本中重定向stdin 和stdout 16-4. 避免子shell 16-5. while 循环的重定向 16-6. 另一种while 循环的重定向 16-7. until 循环重定向 16-8. for 循环重定向 16-9. for 循环重定向 loop (将标准输入和标准输出都重定向了) 16-10. 重定向if/then 测试结构 16-11. 用于上面例子的"names.data"数据文件 16-12. 记录日志事件 17-1. 广播: 发送消息给每个登录上的用户 17-2. 仿造文件: 创建一个两行的仿造文件 17-3. 使用cat 的多行消息 17-4. 带有抑制tab 功能的多行消息 17-5. 使用参数替换的here document 17-6. 上传一个文件对到"Sunsite"的incoming 目录 17-7. 关闭参数替换 17-8. 一个产生另外一个脚本的脚本 17-9. Here documents 与函数 17-10. "匿名" here Document 17-11. 注释掉一段代码块 17-12. 一个自文档化(self-documenting)的脚本 17-13. 在一个文件的开头添加文本 20-1. 子shell 中的变量作用域 20-2. 列出用户的配置文件 20-3. 在子shell 里进行串行处理 21-1. 在受限的情况下运行脚本 23-1. 简单函数 23-2. 带着参数的函数 23-3. 函数和被传给脚本的命令行参数 23-4. 传递间接引用给函数 23-5. 解除传递给函数的参数引用 23-6. 再次尝试解除传递给函数的参数引用 23-7. 两个数中的最大者 23-8. 把数字转化成罗马数字 23-9. 测试函数最大的返回值 23-10. 比较两个大整数 23-11. 用户名的真实名 23-12. 局部变量的可见范围 23-13. 用局部变量来递归 23-14. 汉诺塔 24-1. 脚本中的别名 24-2. unalias: 设置和删除别名 25-1. 使用"与列表(and list)"来测试命令行参数 25-2. 用"与列表"的另一个命令行参数测试 25-3. "或列表"和"与列表"的结合使用 26-1. 简单的数组用法 26-2. 格式化一首诗 26-3. 多种数组操作 26-4. 用于数组的字符串操作符 26-5. 将脚本的内容传给数组 26-6. 一些数组专用的工具 26-7. 关于空数组和空数组元素 26-8. 初始化数组 26-9. 复制和连接数组 26-10. 关于连接数组的更多信息 26-11. 一位老朋友: 冒泡排序 26-12. 内嵌数组和间接引用 26-13. 复杂数组应用: 埃拉托色尼素数筛子 26-14. 模拟下推的堆栈 26-15. 复杂的数组应用: 列出一种怪异的数学序列 26-16. 模拟二维数组,并使它倾斜 27-1. 利用/dev/tcp 来检修故障 27-2. 搜索与一个PID 相关的进程 27-3. 网络连接状态 28-1. 隐藏cookie 而不再使用 28-2. 用/dev/zero 创建一个交换临时文件 28-3. 创建ramdisk 29-1. 一个错误的脚本 29-2. 丢失关键字(keyword) 29-3. 另一个错误脚本 29-4. 用"assert"测试条件 29-5. 捕捉 exit 29-6. 在Control-C 后清除垃圾 29-7. 跟踪变量 29-8. 运行多进程 (在多处理器的机器里) 31-1. 数字和字符串比较是不相等同的 31-2. 子SHELL 缺陷 31-3. 把echo 的输出用管道输送给read 命令 33-1. shell 包装 33-2. 稍微复杂一些的shell 包装 33-3. 写到日志文件的shell 包装 33-4. 包装awk 的脚本 33-5. 另一个包装awk 的脚本 33-6. 把Perl 嵌入Bash 脚本 33-7. Bash 和 Perl 脚本联合使用 33-8. 递归调用自己本身的(无用)脚本 33-9. 递归调用自己本身的(有用)脚本 33-10. 另一个递归调用自己本身的(有用)脚本 33-11. 一个 "彩色的" 地址资料库 33-12. 画盒子 33-13. 显示彩色文本 33-14. "赛马" 游戏 33-15. 返回值技巧 33-16. 整型还是string? 33-17. 传递和返回数组 33-18. anagrams 游戏 33-19. 在shell 脚本中调用的窗口部件 34-1. 字符串扩展 34-2. 间接变量引用 - 新方法 34-3. 使用间接变量引用的简单数据库应用 34-4. 用数组和其他的小技巧来处理四人随机打牌 A-1. mailformat: Formatting an e-mail message A-2. rn: A simple-minded file rename utility A-3. blank-rename: renames filenames containing blanks A-4. encryptedpw: Uploading to an ftp site, using a locally encrypted password A-5. copy-cd: Copying a data CD A-6. Collatz series A-7. days-between: Calculate number of days between two dates A-8. Make a "dictionary" A-9. Soundex conversion A-10. "Game of Life" A-11. Data file for "Game of Life" A-12. behead: Removing mail and news message headers A-13. ftpget: Downloading files via ftp A-14. password: Generating random 8-character passwords A-15. fifo: Making daily backups, using named pipes A-16. Generating prime numbers using the modulo operator A-17. tree: Displaying a directory tree A-18. string functions: C-like string functions A-19. Directory information A-20. Object-oriented database A-21. Library of hash functions A-22. Colorizing text using hash functions A-23. Mounting USB keychain storage devices A-24. Preserving weblogs A-25. Protecting literal strings A-26. Unprotecting literal strings A-27. Spammer Identification A-28. Spammer Hunt A-29. Making wget easier to use A-30. A "podcasting" script A-31. Basics Reviewed A-32. An expanded cd command C-1. Counting Letter Occurrences K-1. Sample .bashrc file L-1. VIEWDATA.BAT: DOS Batch File L-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT P-1. Print the server environment

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值