Linux重定向详解
((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) 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已经连到 管道中了, 第 二对括号:((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 和其后(第二个)管道.前面的 FD1 已经不送给 cmd2了,FD2 默认也不送过来, 第 三对括号:(((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的错误输出, 第 四对括号:((((cmd1 1>&3 ; echo $? >&4 )| cmd2 ) 3>&1 | cmd3 >a 2>&3 ) 2>&1 | cmd4 >b ) 与其后的 4>&1.四对括号 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |