已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
原文地址: /thread-391273-1-1.html推荐 shell中I/O重定向 详解及例子! 复制链接1、基本概念a、I/O重定向通常与 FD有关,shell的FD通常为10个,即 09;b、常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关;c、用 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案;e、0 是 的默认值,因此 与 0 与 1 是一样的;f、在IO重定向 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料;g、管道“|”(pipe line):上一个命令的 stdout 接到下一个命令的 stdin;h、tee 命令是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;i、bash(ksh)执行命令的过程:分析命令变量求值命令替代(和$( ))重定向通配符展开确定路径执行命令;j、( )将 command group 置于 sub-shell 去执行,也称 nested sub-shell,它有一点非常重要的特性是:继承父shell的Standard input, output, and error plus any other open file descriptors。k、exec 命令:常用来替代当前 shell 并重新启动一个 shell,换句话说,并没有启动子 shell。使用这一命令时任何现有环境都将会被清除,。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的 shell 环境。2、基本IOcmd file 把 stdout 重定向到 file 文件中cmd file 把 stdout 重定向到 file 文件中(追加)cmd 1 fiel 把 stdout 重定向到 file 文件中cmd file 2&1 把 stdout 和 stderr 一起重定向到 file 文件中cmd 2 file 把 stderr 重定向到 file 文件中cmd 2 file 把 stderr 重定向到 file 文件中(追加)cmd file 2&1 把 stderr 和 stderr 一起重定向到 file 文件中cmd file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdoutcat file 以读写的方式打开 filecmd file cmd 命令以 file 文件作为 stdincmd &n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出&n 标准输入复制自文件描述符 n&- 关闭标准输出n&- 表示将 n 号输出关闭上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的 0 或 1。如:. 2file 运行一个命令并把错误输出(文件描述符 2)定向到 file。. 2&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)2&1说明:2&1 也就是 FD2FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 是改变送出的数据信道,通俗的说是:把stderr并到stdout。但使用类似 cmd 1&3 这样的形式时,原理相同,但往往不同于 2&1 和 1&2 通常用来合并的作用。 注意:普通cmd命令的cmd n&n 和exec n&n 是有区别的。 exec 0outfilename # 打开文件outfilename作为stdout exec 2errfilename # 打开文件 errfilename作为 stderr exec 0&- # 关闭 FD1 exec 5&- # 关闭 FD5问:如果关闭了 FD0、FD1、FD2,其后果是什么?恢复 FD0、FD1、FD2与 关闭FD0、FD1、FD2 有什么区别?代码分别是什么?打开了FD3FD9,我们用完之后,你觉得是将他们关闭还是恢复?下面是提示(例子来源于CU):exec 6&2 2ver # FD2(本来往monitor送的) 定向到文件vercommand dev/null & #丢弃FD1(stdout)exec 2&6 # 恢复 FD24、简单举例(其中 yes.txt存在,no.txt不存在)a、stdout 和stderr 都通过管道送给egrep了: (ls yes.txt 2&1;ls no.txt 2&1) 2&1|egrep * file (ls yes.txt;lsno.txt) 2&1|egrep * file#这个例子就是让大家:理解 命令执行顺序 和 管道“|” 在命令执行前,先要进行重定向的处理,并将把 nested sub-shell 的stdout 接到 egrep 命令的 stdin。 nested sub-shell ,在 ( ) 中的两个命令可以看作一个命令。其 stdout(FD1) 通过 “|” 作为 egrep 的 stdin,再加上 2&1 时,初始 stdout 和 stderr 都往管道 “|” 送。#b、没有任何东西通过管道送给egrep,全部送往monitor。 (ls yes.txt 2&1;ls no.txt 2&1) &2|egrep * file 虽然在()里面将 FD2转往FD1,但在()外,遇到 &2 ,结果所有的都送到monitor。5、中阶例子(其中 you 这个文件是存在的,no 和 wu 这两个文件不存在)r2007兄的:/forum/v . d2b16313c6922123f67条件:stderr通过管道送给egrep,正确消息仍然送给monitor(不变)exec 4&1;(ls you no 2&1 1&4 4&-;ls wu 2&1 1&4 4&-)|egrep * file;exec 4&-或者exec 4&1;(ls you no;ls wu) 2&1 1&4 4&-|egrep * file;exec 4&-r2007 兄在其贴已有详细说明,如果加两个条件:(1)要求cmd1和cmd2并行运行;(2)将cmd1的返回值赋给变量 ss。则为:exec 3&1;exec 4&1ss=$(ls you no 2&1 1&3 3&-;echo $? &4)|egrep * file) 4&1)exec 3&-;exec 4&-说明:exec 3&1;4&1# 建立FD3,是用来将下面ls那条语句(子shell)中的FD1 恢复到正常FD1,即输出到monitor,你可以把FD3看作最初始的FD1的硬盘备份(即输出到monitor);# 建立FD4,到时用作保存ls的返回值(echo $?),你可以将FD4看作你考试时用于存放计算“echo $?”的草稿纸;(ls you no 2&1 1&3 3&-;echo $? &4)# 大家还记得前面说的子shell和管道吧。这条命令首先会继承FD0、FD1、FD2、FD3、FD4,它位于管道前,所以在运行命令前会先把子shell自己的FD1和管道“|”相连。但是我们的条件是stderr通过管道送往egrep,stdout仍然输出到monitor。于是通过2&1,先把 子shell的FD1 的管道“送给”FD2,于是子shell中的stderr送往管道“|”;再通过 1&3,把以前的“硬盘备份”恢复给子shell的FD1,于是子shell中的FD1变成送到monitor了。再通过3&- ,将3关闭;接着运行echo $? ,本来其输出值应该送往管道的,通过 &4 ,将 输出 送往 “草稿纸”FD4,留以备用。(ls you no 2&1 1&3 3&-;echo $? &4)|egrep * file)于是,stderr 通过管道送给 egrep ,stdout 送给monitor,但是,还有 FD4,它送到哪去了?$(ls you no 2&1 1&3 3&-;echo $? &4)|egrep * file) 4&1)最后的 4&1 ,就是把FD4 重定向到 FD1。但由于其输出在 $( )中,其值就赋给变量ss了。最后一行关闭 FD3、FD4。6、高阶例子lightspeed 版主大大的:Shell 经典问题之 I/O 重定向 (/forum/v . 9&show_type=new)Q 对于命令 cmd1, cmd2, cmd3, cmd4. 如何利用单向管道完成下列功能: 1. 所有命令并行执行 2. cmd1 和 cmd2 不需要 stdin 3. cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin 4. cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin 5. cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕 6. cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕 7. cmd1 的返回码赋给变量 s 8. 不能利用临时文件解决方法: exec 3&1; exec 4&1 my_value=$(cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 | cmd3 a 2&3 ) 2&1 | cmd4 b ) 4&1) exec 3&-; exec 4&-解释: exec 3&1; exec 4&1建立FD3 ,给cmd1恢复其FD1用和给cmd3 恢复其FD2用;建立FD4,保存“echo $?”输出值的“草稿纸” 第一对括号到第一个管道:(cmd1 1&3 ; echo $? &4 )| cmd1本身没有stdin,其stdout原要送往第一个管道,由于1&3的作用,其stdout被送往FD3;而 &4 的作用实际是将 cmd1 运行后的返回码送往 FD4。cmd1的stderr默认等待下一步处理。最后,没有往管道送任何东西; 第二对括号到第二个管道:(cmd1 1&3 ; echo $? &4 )| cmd2) 3&1| 由于第一个括号中cmd1的 stdout 被送往 FD3,导致管道左端没有任何输入,cmd2 从而就没有stdin。cmd2 的stdout则为默认的; 将第二对括号看出一个命令,其所有的stdout送往第二个管道“|”;同时由于3&1的作用,原先cmd1的stdout在送往FD3 又与cmd2的stdout并到一起,所以cmd1 和 cmd2 的 stdout 都送往第二个管道“|”。而cmd1、cmd2的stderr仍然默认等待下一步处理; 第三对括号到第三个管道:(cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 | cmd3 a 2&3 ) 2&1| cmd3 a 2&3:cmd3接收处理来自管道的stdin后,其 stdout 送给文件a,其stderr送往FD3,由于FD3继承FD1,实际上其stderr是送往monitor。如果没有“2&3”,那么 cmd3的stderr就会干扰cmd1和cmd2的错误输出,所以它是必须的; 将第三个括号里完全看作一个命令,其stdout送往管道 “|”,由于2&1,于是stderr也送往着管道。但由于cmd1、cmd2的stdout已经送给了cmd3处理,而cmd3的 stdout输出到文件a,cmd3的stderr也送往monitor,所以实际上只有cmd1和cmd2的stderr送往管道。 cmd4 b:cmd4接收处理来自管道的stdin后,其stdout 定向到文件 b,stderr 默认输出到monitor。 第四对括号:( (cmd1 1&3 ; echo $? &4 )| cmd2 ) 3&1 | cmd3 a 2&3 ) 2&1|cmd4 b ) 4&1 四对括号里面所有命令的 FD1、FD2都处理完了,但是还有“echo $? &4”没处理。“4&1”的作用就是“将FD4并到stdout”,但由于其他命令的stdout都处理完了,实际上就只有 $? 的值。 又由于 $() 会建立一个管道,输入端为()内命令,故 $? 的值被赋给变量 my_value。 最后一行是关闭FD3和FD4。 另:恢复重定向或关闭的stdout:exec 1&2 ,恢复重定向或关闭的stderr:exec 2&1。如果stdout和stderr全部都关闭了,又没有保存原来的FD,可以用:exec 1/dev/tty 恢复。7、在一个交互式的(Interactive) shell 中, 用 exec 进行 I/O 重定向.1). Stdin, stderr 可以定向到文件中吗? 有什么结果? a、在交互式shell中,可以将stdin定向到文件。执行:exec 0in结果为:in 文件中每一行均会被自动执行,并且在最后会再加执行一个 exit 命令,导致退出(或退回到正常shell下)。如 in 文件内容:$ more indateread lspecho hahhaecho this is $lsp在提示符下执行命令:$ exec 0err结果为:命令提示符PS被屏蔽,输入的命令也被屏蔽。但是命令执行的结果,如果是stdout 则会回显到屏幕上,如果是 stderr 则不会回显到屏幕上。其中,命令提示符、命令、stderr均会保存到文件 err 中。如:$ exec 2errerrinout # 执行 ls 命令Tue Jan 18 18:55:58 HKT 2005 # 执行 date 命令,而后执行了“ ls nofile”,nofile这个文件不存在$ # 执行 exit 命令现在让我们查看 err文件:$ more errlspii lsp$ lslspii lsp$ datelspii lsp$ ls nofilels: nofile: No such file or directorylspii lsp$ exitexit c、在交互式shell中,可以将stdout定向到文件。这个使我们常用到的。就不说了。就是将错误的输出内容定向到文件中。正确的输出内容并不受影响。2). Stdin, Stderr 可以关闭吗? 有什么结果?在交互式shell中,如果关闭stdin,如:exec 0&- ,状态同stderr定向到文件,唯一不同的是没有保存下来。在交互式shell中,如果关闭stdoutr,如:exec 1&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年可再生能源在能源行业中的应用前景研究报告
- 2025年互联网科技行业人工智能技术发展前景研究报告
- 2025年激光条幅机行业研究报告及未来发展趋势预测
- 商场冬季安全培训内容课件
- 岗位聘任协议书9篇
- 山东省2025年山东中医药大学公开招聘工作人员(24人)笔试历年参考题库附带答案详解
- 宜昌市2025湖北宜昌市教育局所属事业单位急需紧缺人才引进校园(华中师范大学站)笔试历年参考题库附带答案详解
- 宁波市2025年浙江工商职业技术学院公开招聘11人笔试历年参考题库附带答案详解
- 国家事业单位招聘2025国家监管中心招聘高校应届毕业生及安排笔试历年参考题库附带答案详解
- 国家事业单位招聘2025中国康复研究中心招聘高层次人才拟聘用人员笔试历年参考题库附带答案详解
- 物流园区规章制度模版(2篇)
- 《多能源耦合供热系统》
- 《搞定:无压工作的艺术》完整课件
- 京东方岗位胜任力测评题库
- 印刷包装公司安全生产管理方案
- 高中数学64数列求和省公开课获奖课件市赛课比赛一等奖课件
- 二手车国庆节活动方案
- 人教版八年级上册地理教学计划及进度表
- 2025高考物理步步高同步练习必修3练透答案
- DZ∕T 0215-2020 矿产地质勘查规范 煤(正式版)
- 2024年初中升学考试九年级数学专题复习新课标要求-中考33讲
评论
0/150
提交评论