免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 24944 | 回复: 37
打印 上一主题 下一主题

shell的输入与输出  关闭 [复制链接]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
1 [报告]
发表于 2003-12-12 18:13 |只看该作者

shell的输入与输出

此贴是从另外一个主题移过来的,代码如下
代码:

  1. exec 9>&1
  2. comd1 2>&1 >&9 9>&- | comd2 9>&-
  3. exec 9>&-
复制代码


comd1和comd2代表任意的命令。
该脚本使comd1的错误输出通过管道作为comd2的输入,comd1的正常输出仍然保持。


原帖由 "r2007" 发表:

正相反,是从左向右操作的。
fd: 文件描述符,默认有0,1,2分别用作输入、输出和错误输出。可以理解为C中的file handle,也可以理解为文件指针,shell默认有10个fd。
先写到这儿,下班了。

接着说:
exec 9>&1 #把fd1的指针复制到fd9,即dup(1,9),或者干脆理解为fd9=fd1
#注意,此时fd9和fd1同时指向一个文件。也可认为将fd1的指针保存在fd9中一份
comd1 2>&1 >&9 9>&- | comd2 9>&-
#这一句比较麻烦
#首先shell创建一个pipe,然后分别folk两个subshell
#看看第一个subshell做了什么?
#首先每个subshell都精确拷贝一份父进程的fd表,即0,1,2和9都复制过来了
#然后将fd1指向pipe文件,此时fd9仍然保存着父进程中fd1的文件指针,如果父进程没有重定向的话,就是stdout
#然后处理这段2>&1 >&9 9>&重定向命令。既
#fd2=fd1; fd1=fd9; fd9=null
#结果是fd2指向fd1原先指向的pipe文件,fd1指向fd9指向的文件,即stdout,然后将fd9关闭,由于这时fd1和fd9同时指向同一个文件stdout,所以stdout并没有真正关闭,只是减少打开次数。
#最后subshell执行comd1命令,comd1要输出时取fd1中的指针,即stdout,输出错误时,取fd2中的指针,即pipe,这样comd2从pipe中只得到了comd1输出的错误信息。
#再看看第二个subshell做了什么?
#同样精确拷贝一份父进程的fd表
#然后将fd0指向pipe文件。
#然后处理这段 9>&重定向命令。既关闭fd9。

exec 9>&- #回到父进程,关闭fd9

[ 本帖最后由 r2007 于 2006-3-15 11:36 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-12-12 18:41 |只看该作者

shell的输入与输出

哦?
又學到了﹗  ^_^

你們真強啊﹗

论坛徽章:
0
3 [报告]
发表于 2003-12-12 21:20 |只看该作者

shell的输入与输出

致r2007兄,
确实是我弄错了。谢!
---------------------
dup2(a, b)后,
因为b=a, 所以对b文件的读写就变成读写a文件。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-12-12 21:29 |只看该作者

shell的输入与输出

精彩!

论坛徽章:
0
5 [报告]
发表于 2003-12-12 21:55 |只看该作者

shell的输入与输出

高论。

论坛徽章:
0
6 [报告]
发表于 2003-12-13 00:41 |只看该作者

shell的输入与输出

看不懂啊

论坛徽章:
0
7 [报告]
发表于 2003-12-13 01:03 |只看该作者

shell的输入与输出

[quote]原帖由 "windowsnt"]看不懂啊[/quote 发表:

ME TOO

论坛徽章:
0
8 [报告]
发表于 2003-12-15 11:48 |只看该作者

shell的输入与输出

晕 , 举例说明可以吗?

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
9 [报告]
发表于 2003-12-15 12:15 |只看该作者

shell的输入与输出

[quote]原帖由 "panlm"]晕 , 举例说明可以吗?[/quote 发表:

此贴是从另外一个主题移过来的,代码如下

  1. exec 9>&1
  2. comd1 2>&1 >&9 9>& | comd2 9>&
  3. exec 9>&
复制代码

comd1和comd2代表任意的命令。
该脚本使comd1的错误输出通过管道作为comd2的输入,comd1的正常输出仍然保持。

论坛徽章:
0
10 [报告]
发表于 2005-01-16 23:54 |只看该作者

shell的输入与输出

exec 9>&1
comd1 2>&1 >&9 9>&− | comd2 9>&−
exec 9>&−

下面这句还有点疑惑:
comd1 2>&1 >&9 9>&− | comd2 9>&−

comd1 2>&1   这个是将 fd1 复制到 fd2(包括管道连接),那fd2 实际上只有 fd1(是不是 原有属性的fd,如fd1、fd2、fd0,复制自其他fd时,本事的仍然还保留)这个属性(按照 重定向规则,这个又是“将 错误输出并到标准输出中”)。
>&9               这个是将fd1恢复正常。
第一个 9>&−   关闭cmd1的fd9
第二个9>&−    关闭cmd2的fd9

那最后的结果仍然是 cmd1 的  fd2(fd2实际上是标准输出fd1)  通过管道 作为cmd2 的输入了,为何说是:“使comd1的错误输出通过管道作为comd2的输入,comd1的正常输出仍然保持”?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP