免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: shaoping0330
打印 上一主题 下一主题

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

论坛徽章:
0
21 [报告]
发表于 2005-01-25 23:32 |只看该作者

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

非常感谢,你帮了我大忙。

论坛徽章:
0
22 [报告]
发表于 2005-02-04 17:40 |只看该作者

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

难得啊!!

论坛徽章:
0
23 [报告]
发表于 2005-02-04 17:45 |只看该作者

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

楼主希好人。

论坛徽章:
0
24 [报告]
发表于 2005-04-03 19:06 |只看该作者

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

原帖由 "shaoping0330" 发表:

exec 4>&1
cmd1 2>&1 1>&4|tee -a ufile
exec 4>&-

------------------------
上面的脚本把错误输出重定向到文件,并显示在屏幕上。 那能否同时打印出错语句的程序名称、进程号等信息呢? 〔因为调用子函数、程序等错误输出往往没有出错的程序名称、进程等信息,很多时候都不知道是哪个程序出错了〕

论坛徽章:
0
25 [报告]
发表于 2005-04-04 13:31 |只看该作者

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

up,高手请帮忙一下

论坛徽章:
0
26 [报告]
发表于 2005-04-04 14:33 |只看该作者

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

使用好的编程风格
在主程序中专门写个容错函数
例如:
  1. runfunction()
  2. {
  3.   $*
  4.   if [ $? -ne 0 ]
  5.   then
  6.   echo "ERROR found in function $1"
  7.      let "errorCounter = errorCounter + 1"
  8. fi
  9. }
复制代码

用来调用函数,即可知哪个函数出错。
或者直接在函数、程序中写报错语句段,则定位更为准确。

论坛徽章:
0
27 [报告]
发表于 2005-04-04 16:28 |只看该作者

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

看到中阶我就不能理解了,注意是关于fd4的问题。

  1. 如果加两个条件:
  2. (1)要求cmd1和cmd2并行运行;
  3. (2)将cmd1的返回值赋给变量 ss。
  4. 则为:
  5. exec 3>&1;exec 4>&1
  6. ss=$(((ls you no 2>&1 1>&3 3>&-;echo $? >&4)|egrep \* >file) 4>&1)
  7. exec 3>&-;exec 4>&-
复制代码


刚开始时如果fd1为stdout,则执行了exec 4>&1后fd4也代表stdout。
在第二句中执行echo $? >$4时,原来的1应指向pipe,执行后1指到4(即stdout),最后的4>&1不是没有必要吗(此时4和1都指向stdout)
我的想法肯定是错误的,因为按照我的想法,cmd1(即ls...)的1指到stdout
,cmd2(即echo ..)的1也指向stdout(需然cmd2指向是4,4就是stdout),两个命令的输出都是stdout,因为命令是在$()中执行的,stdout的都被送到ss中。这样的话就没有显示了。实际情况却分开了。cmd1的结果显示在屏幕上,而cmd2的输出送到ss中。我哪里想错了,按我的理解这两个要么如显示要么全送到ss。
请大哥为我解惑!!

论坛徽章:
0
28 [报告]
发表于 2005-04-04 22:20 |只看该作者

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

我的分析
两种情况下,子进程的fd1不继承于父进程
1.当出现管道时,fd1变成指向管道
2.$(),fd1变成指向$(cmd)这个值(有点说不清这个fd指向的具体是什么),反正不是标准输出,您$(echo ls)看看输出ls了没有
(ls you no 2>&1 1>&3 3>&-;echo $? >&4)这句让ls的正确信息和echo的正确信息都定向到monitor(此时所有的fd都是继承于父进程),最后的4>&1把fd4定向到$()的值(因为此时的fd1指向的是$()的值,而不是标准输出)
,如果没有最后的4>&1,那么$()里什么都没有,因为ls、echo的输出指向标准输出,egrep的输出指向file,没有指向到$()的
勉强自圆其说,还请高手指教

论坛徽章:
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
29 [报告]
发表于 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>&-
复制代码

论坛徽章:
0
30 [报告]
发表于 2005-04-04 23:09 |只看该作者

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

原来$()也会建立管道,这样就解释通了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP