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)的 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |