Linux系统的Shell I/O重定向详解
3、进阶IO >&n 使用系统调用 dup (2)复制文件描述符 n并把结果用作标准输出; <&n 标准输入复制自文件描述符 n; <&- 关闭标准输入(键盘); >&- 关闭标准输出; n<&- 表示将n号输入关闭; n>&- 表示将n号输出关闭; 上述所有形式都可以前导一个数字,此时建立的文件描述符由这个数字指定而不是缺省的0 或 1。如: ... 2>file运行一个命令并把错误输出(文件描述符 2)定向到file。 ... 2>&1运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。) 我们对 2>&1详细说明一下 :2>&1 也就是 FD2=FD1 ,这里并不是说FD2的值等于FD1的值,因为> 是改变送出的数据信道,也就是说把 FD2的“数据输出通道” 改为FD1的“数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为FD2的默认输出和 FD1的默认输出本来都是 monitor,一样的! 但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。 exec 0exec 1>outfilename # 打开文件outfilename作为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一帖子,忘记出处,来日再补上):
4、简单举例 a、stdout和stderr都通过管道送给egrep了:
这个例子要注意的就是: 理解命令执行顺序和管道“|”:在命令执行前,先要进行重定向的处理,并将把 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。 请理解:
(编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |