Linux重定向详解
e作为stdout.
exec 2>errfilename # 打开文件 errfilename作为 stderr. exec 0<&- # 关闭 FD0. exec 1>&- # 关闭 FD1. exec 5>&- # 关闭 FD5. 问: 如果关闭了 FD0、FD1、FD2,其后果是什么? 恢复 FD0、FD1、FD2与 关闭FD0、FD1、FD2 有什么区别?代码分别是什么? 打开了FD3~FD9,我们用完之后,你觉得是将他们关闭还是恢复? 下面是提示(例子来源于CU一帖子,忘记出处,来日再补上): exec 6>&2 2>ver command >>dev/null & exec 2>&6 # 恢复 FD2 4、 简单举例 a、stdout和stderr都通过管道送给egrep了: (ls you no 2>&1;ls yes 2>&1) 2>&1|egrep * >file (ls you no 2>&1;ls yes 2>&1)|egrep * >file (ls you no;ls yes) 2>&1|egrep * >file 这个例子要注意的就是: 理 解 命令执行顺序 和 管道“|”:在命令执行前,先要进行重定向的处理,并将把 nested sub-shell 的stdout 接到 egrep 命令的 stdin. nested sub-shell ,在 ( ) 中的两个命令加上(),可以看作一个命令.其 FD1 已经连接到“|”往egrep送了,当遇到 2>&1时,也就是FD2=FD1,即FD2同FD1一样,往管道 “|”那边送. b、 没有任何东西通过管道送给egrep,全部送往monitor. (ls you no 2>&1;ls yes 2>&1) >&2|egrep * >file.虽然在()里面将 FD2转往FD1,但在()外,遇到 >&2 ,结果所有的都送到monitor. 请理解: (ls you no 2>&1) 1>&2|egrep * >file ## 送到 monitor ls you no 2>&1 1>&2|egrep * >file ## 送给 管道 “|” ls you no 1>&2 2>&1|egrep * >file ## 送到 monitor 5、 中阶例子 条件: stderr通过管道送给egrep,正确消息仍然送给monitor(不变) exec 4>&1;(ls you no 2>&1 1>&4 4>&-;ls yes 2>&1 1>&4 4>&-)|egrep * >file;exec 4>&- 或者 exec 4>&1;(ls you no;ls yes) 2>&1 1>&4 4>&-|egrep * >file;exec 4>&- 如果加两个条件: (1)要求cmd1和cmd2并行运行; (2)将cmd1的返回值赋给变量 ss. 则为: exec 3>&1;exec 4>&1 ss=$(((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,留以备用. |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |