单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2019/2/3,#,7,-,1,目标,学习了本单元后,大家应该能够:,把,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/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,-,5,把输出重新导向到文件,STDOUT,和,STDERR,可以被重导向到文件:,命令 操作符号 文件名,支持的操作符号包括:,1,把,STDOUT,重导向到文件 (,1,),2,把,STDERR,重导向到文件,&,把所有(,标准输出和标准错误输出,)输出重导向到文件,文件内容被默认覆盖。,会后补。,常见的重定向操作符,命令,文件,-,把命令标准输出重定向文件,命令,文件,-,把命令标准输出追加到文件最后,命令,文件,-,把命令中错误的输出重定向到文件,命令,2,把命令的错误输出追加到文件最后,7,-,7,把输出重新导向到文件,例子,当使用非根用户身份运行时,该命令会同时生出输出和错误:,$,find/etc-namepasswd,可以使用操作符号来保存输出和错误:,$,find/etc-namepasswdfind.out,$,find/etc-namepasswd2/dev/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;cal2008)|less,(现场演示),下面就是上面的例子运行结果截图,7,-,18,重导向到多个目标(,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.out,7,-,20,从文件中导入,STDIN,使用,来重导向标准输入,某些命令,能够接受从文件中导入的,STDIN,:,$,trA-Za-z.bash_profile,该命令会把,.bash_profile,中的大写字符都转换成小写字符,相当于:,$,cat.bash_profile|trA-Za-z,7,-,21,把多行发送给,STDIN,使用,终止单词,命令:从键盘把多行重导向给,STDIN,直到,终止单词,为止的所有文本都被发送给,STDIN,有时被称为就地文本(,heretext,),下面是我的测试例子,7,-,23,脚本:,for,循环,对一组值中的每个成员执行行动,例如:,运行结果如下,rootstation20 home#for NAME in boss bill oracle,do,ADDRESS=$NAME Message=projects are due today“,echo$Message|mail-s reminder$ADDRESS,done,You have new mail in/var/spool/mail/root,7,-,25,脚本:,for,循环,继续,也可以使用命令输出和文件列表:,for num in$(seq 1 10),把从,1,到,10,的数字分配给变量,$num,seq X Y,会显示,X,到,Y,之间的数字,for file in*.txt,把通配文本文件的文件名分配给变量,$file,7,-,27,结束 单元,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,