快速业务通道

Linux重定向详解

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

分享到: 更多

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号