1、7-1单元 7标准I/O和管道7-2目标学习了本单元后,大家应该能够:把I/O频道重导向入文件 使用管道连接命令 使用for循环来逐项处理一组数值标准管道的输入与输出 标准输入stdin 默认接受来自键盘的输入 标准输出stdout 默认输出到终端窗口 标准错误输出stderr 默认输出到终端窗口 Stdin 文件描述码 0 Stdout 文件描述码 1 Stderr 文件描述码 2首先查看std先关的设备文件 rootstation20 test#ls-l/dev/std*lrwxrwxrwx.1 root root 15 Sep 24 2011/dev/stderr-/proc/self/
2、fd/2 lrwxrwxrwx.1 root root 15 Sep 24 2011/dev/stdin-/proc/self/fd/0 lrwxrwxrwx.1 root root 15 Sep 24 2011/dev/stdout-/proc/self/fd/1 rootstation20 test#下面是一个例子查看标准输出和标准错误输出ls-la/etc/password/etc/passwd 上面输出的信息都显示在屏幕上,实际上第一导向标准错误流和第二行导向标准输出7-6把输出重新导向到文件 STDOUT和STDERR可以被重导向到文件:命令 操作符号 文件名 支持的操作符号包括:1
3、 把STDOUT重导向到文件 (1)2 把STDERR重导向到文件&把所有(标准输出和标准错误输出)输出重导向到文件 文件内容被默认覆盖。会后补。常见的重定向操作符 命令 文件 -把命令标准输出重定向文件 命令 文件-把命令标准输出追加到文件最后 命令 文件-把命令中错误的输出重定向到文件 命令2 把命令的错误输出追加到文件最后7-8把输出重新导向到文件例子 当使用非根用户身份运行时,该命令会同时生出输出和错误:$find/etc-namepasswd 可以使用操作符号来保存输出和错误:$find/etc-namepasswdfind.out$find/etc-namepasswd2/dev/
4、null$find/etc-namepasswdfind.out2find.err 下一张幻灯片会显示结果 这个是标准输出流,只输出正确的结果 下面就是将错误消息导入到/dev/null(黑洞),只显示标准输出 下面就是将标准输出导出到find.out,错误的导出到find.err.这个例子就是把文件作为输入发送给cat命令#cat:重导向所有输出:$find/etc-namepasswd&find.all 2&1:把STDERR重导向给STDOUT 要通过管道来发送所有输出时有用$find/etc-namepasswd2&1|less ():合并多个程序的STDOUT$(cal2007;ca
5、l2008)|less(现场演示)下面就是上面的例子运行结果截图7-19重导向到多个目标(tee)$命令1|tee 文件名|命令2 把命令1的STDOUT保存在文件名中,然后管道输入给命令2 使用:复杂管道的故障排除 同时查看和记录输出下面就是一个重定向到夺目标的例子 studentstation20$ls-lR/etc/|tee stage1.out|sort|tee stage2.out|uniq-c|tee stage3.out|sort-r|tee stage4.out7-21从文件中导入STDIN使用来重导向标准输入某些命令能够接受从文件中导入的STDIN:$trA-Za-z.bas
6、h_profile 该命令会把.bash_profile中的大写字符都转换成小写字符相当于:$cat.bash_profile|trA-Za-z 7-22把多行发送给STDIN 使用 终止单词终止单词 命令:从键盘把多行重导向给STDIN 直到 终止单词终止单词 为止的所有文本都被发送给STDIN 有时被称为就地文本(heretext)下面是我的测试例子7-24脚本:for循环 对一组值中的每个成员执行行动 例如:运行结果如下 rootstation20 home#for NAME in boss bill oracle do ADDRESS=$NAME Message=projects ar
7、e due today“echo$Message|mail-s reminder$ADDRESS done You have new mail in/var/spool/mail/root7-26脚本:for循环继续 也可以使用命令输出和文件列表:for num in$(seq 1 10)把从1到10的数字分配给变量$numseq X Y 会显示X到Y之间的数字 for file in*.txt把通配文本文件的文件名分配给变量$file7-28结束 单元 7 答疑 总结 标准I/O频道 文件重导向标准输入()标准错误(2)管道会把标准输出重导向到标准输入 for循环可以对程序的标准输出中的项目或一个明确列表中的项目执行命令实验例子(5,6)如果去掉括号的话就会出现如下结果 Date会作为标准输出显示在屏幕 邮件中的内容开头就没有了时间测试网络中计算机的网络连通性脚本 rootstation20 test#vim alive.sh#!/bin/bash for n in 1.20;do hosts=192.168.25.$n ping-c 2$hosts&/dev/null if$?=0;then echo$hosts is up else echo$hosts is down fi done