快速业务通道

Linux重定向详解

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-25

  ((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、 高阶例子

  命令 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 s=$(((((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 ) 和其后(第一个)管道.在第一个括号(子shell)中,其FD1已经连到 管道中了,用 FD3 将 FD1恢复正常,不让他往管道跑;这里的cmd1没有stdin,接着将 cmd1 运行的返回码 保存到 FD4 中.

  第 二对括号:((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 和其后(第二个)管道.前面的 FD1 已经不送给 cmd2了,FD2 默认也不送过来,cmd2 也没有stdin ,在第二对括号里面:cmd1和cmd2 的stdout、stderr 为默认输出,一直遇到 “3>&1”为止.请注意:“3>&1”,先将第二对括号看出一个命令,他们遇到 第二个管道时,其FD1 连到 管道 “|”,“3>&1”的作用,子shell的FD1 送给FD3 使用,所有FD3 的输出都 “流往”cmd3,又继承关系(继承第一行的命令),FD3实际上就是cmd1和cmd2的stdout,于是“ cmd1 和 cmd2 的 stdout 定向到 cmd3 的 stdin”

  第 三对括号:(((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 和其后的第三个管道.cmd1 和 cmd2 的 stdout 已经定向到 cmd3 的 stdin,处理之后,cmd3 >a 意味着将其 stdout 送给 a 文件.而2>&3的意思是:恢复cmd3的错误输出为FD3,即送往 monitor.于是“cmd3 的 stdout 定向到文件 a, stderr 定向到屏幕”.如果没有“2>&3”,那么cmd3的错误输出就会干扰cmd1和cmd2的错误输出,它是的!请注意第三对括号后 的 “2>&1”| ,其子shell的FD1 本来连接着管道“|”,但子shell FD1 慷慨大方,送给了 FD2,于是FD2 连接着管道.还记得前面的 cmd1 和 cmd2 吗?他们的stderr一直没动了.于是在这里,通过管道送给了 第四个命令cmd4 了.即“cmd1 和 cmd2 的 stderr 定向到 cmd4 的 stdin”.后面就比较简单了.cmd4 >b 表示“cmd4 的 stdout 定向到文件 b, stderr 定向到屏幕(默认)”

  第 四对括号:((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 与其后的 4>&1.四对括号

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号