免费注册 查看新帖 |

Chinaunix

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

I/O重定向 详解及例子!  关闭 [复制链接]

论坛徽章:
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 [报告]
发表于 2005-01-17 22:18 |显示全部楼层

I/O重定向 详解及例子!

理解透彻!
堪称 I/O BIBLE
佩服佩服!
呼吁加精!

论坛徽章:
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
2 [报告]
发表于 2005-01-18 12:54 |显示全部楼层

I/O重定向 详解及例子!

原帖由 "shaoping0330" 发表:
8、 cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ;
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。
我想:他们的不同点在于:
cmd >a 2>a 相当于使用了两个管道;
而cmd >a 2>&1 只使用了一个管道。
从IO效率上来讲,cmd >a 2>&1 效率应该更高!

还有,a文件打开两遍,有各自的文件指针,会互相覆盖,实际应用中应该避免。

论坛徽章:
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
3 [报告]
发表于 2005-01-18 21:52 |显示全部楼层

I/O重定向 详解及例子!

原帖由 "一梦如是" 发表:

Solaris 8下测试不能用此法恢复,请教该怎么恢复?

没有环境,请梦人自测,不知是否有tty命令?
  1. exec 1>`tty`
复制代码

论坛徽章:
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
4 [报告]
发表于 2005-01-19 22:03 |显示全部楼层

I/O重定向 详解及例子!

  1. cat ./-
  2. more ./-
复制代码

论坛徽章:
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
5 [报告]
发表于 2005-04-04 23:06 |显示全部楼层

I/O重定向 详解及例子!

如果加两个条件:
(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 4>&1是多余的,它可以写成exec 4>&2或干脆去掉,都不影响结果。
ss=$((......) 4>&1)这句应该从外向里分析:
$()会建立一个管道(fd1),输入端为()内命令,输出端即为ss。
4>&1-->(fd4=fd1)把fd4重定向为给ss赋值的管道
第二层()里面的命令如果向fd4写内容,就会被管道的另一端ss得到了。
所以 echo $? >&4这里的重定向就到了ss那里了。
可以简写为
  1. exec 3>&1
  2. ss=$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
  3. exec 3>&-
复制代码

论坛徽章:
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
6 [报告]
发表于 2006-07-03 16:04 |显示全部楼层

exec 4>&1
换成
exec 4>tmplog
试一下
仔细想想到底是哪个 4>&1 在起作用?
另外楼上的出错信息,在我的系统没有出现
kernel 2.4.23

bash, version 2.05b.0

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

论坛徽章:
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
7 [报告]
发表于 2006-07-04 15:00 |显示全部楼层
((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 就相当于 cmd
所以可以看成这样
ss=$(cmd 4>&1)
其它依次类推
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP