免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3022 | 回复: 9

[学习共享] 如何输出到两处并取返回值? [复制链接]

论坛徽章:
0
发表于 2014-04-15 10:13 |显示全部楼层
本帖最后由 hujysh 于 2014-04-15 10:21 编辑

该程序目的是执行一系列命令,输出定向到文件,同时输出到屏幕,并需要取每个命令的返回值。
程序如下,请注意P1  P2的两句。
经多次测试,正常是P1的先做,但是有时候是P2的先做,这样cat $TF就得不到命令的返回值了。
不知道如何解释?如何解决?请高手支招。
  1. $ cat y.sh
  2. #!/bin/sh

  3. quit()
  4. {
  5.   exit $1
  6. }

  7. fdate()
  8. {
  9.   date "+%Y%m%d-%H:%M:%S"
  10. }

  11. elog()
  12. {
  13.    printf "$*\n"
  14.    [ -w $LOGFILE ] && printf "$*\n" >> $LOGFILE
  15. }

  16. init()
  17. {
  18.     date
  19.     return 0
  20. }

  21. fun()
  22. {
  23. echo arg1 is $1
  24. echo arg2 is $2
  25. return 0
  26. }

  27. #----------------------------
  28. # MAIN Main main
  29. #----------------------------
  30. LOGFILE=logfile

  31. #TMPDIR=/tmp/.$(basename $0).$(basename $configfile).tmp.$
  32. #rm -rf $TMPDIR >/dev/null 2>&1
  33. TF=tf

  34. elog "$(fdate)" $(basename $0) $* begin "\n"

  35. TASKNUM=3
  36. TASKNAME1=TASK001            PRG1=init  
  37. TASKNAME2=T000            PRG2="ls y.sh"
  38. TASKNAME3=test0          PRG3="fun A B"

  39. #-----proc tasks-----
  40. i=1
  41. while [ $i -le $TASKNUM ]; do
  42.   PRG=$(eval echo "\$PRG$i")
  43. ( ( eval "$PRG" 2>&1 );echo $?>$TF) | tee -a $LOGFILE           #####  #### #P1
  44. ret=$(cat $TF)                                                          ######   ####  #P2
  45.   rm $TF
  46.   [ $ret -ne 0 ] && eval proctaskfail "\$TASK$i" $ret "\$PRG$i"
  47.   eval elog "$(fdate)" TASK: "\$TASK$i" "\$PRG$i" done with code $ret
  48.   i=$((i+1))
  49. done

  50. elog "\n$(fdate)" $(basename $0) $* done

  51. quit 0

  52. $
复制代码
正常的运行结果如下:
  1. $ sh y.sh
  2. 20140415-10:08:52 y.sh begin

  3. Tue Apr 15 10:08:52 EAT 2014
  4. 20140415-10:08:52 TASK: init done with code 0
  5. y.sh
  6. 20140415-10:08:52 TASK: ls y.sh done with code 0
  7. arg1 is A
  8. arg2 is B
  9. 20140415-10:08:52 TASK: fun A B done with code 0

  10. 20140415-10:08:52 y.sh done
  11. $
复制代码
多次测试的结果不一样,以下是某次测试的结果,############是我手工加上的,需要关注的部分:
  1. $ sh -x y.sh
  2. + LOGFILE=logfile
  3. + TF=tf
  4. + fdate
  5. + basename y.sh
  6. + elog 20140415-09:44:55 y.sh begin \n
  7. 20140415-09:44:55 y.sh begin

  8. + TASKNUM=3
  9. + TASKNAME1=TASK001 PRG1=init
  10. + TASKNAME2=T000 PRG2=ls y.sh
  11. + TASKNAME3=test0 PRG3=fun A B
  12. + i=1
  13. + [ 1 -le 3 ]
  14. + + eval echo $PRG1
  15. + echo init
  16. PRG=init
  17. + eval init
  18. + 2>& 1
  19. + tee -a logfile
  20. + echo 0
  21. + 1> tf
  22. + init
  23. Tue Apr 15 09:44:55 EAT 2014
  24. + +cat tf
  25. ret=0
  26. + rm tf
  27. + [ 0 -ne 0 ]
  28. + fdate
  29. + eval elog 20140415-09:44:55 TASK: $TASK1 $PRG1 done with code 0
  30. + elog 20140415-09:44:55 TASK: init done with code 0
  31. 20140415-09:44:55 TASK: init done with code 0
  32. + i=2
  33. + [ 2 -le 3 ]
  34. + + eval echo $PRG2
  35. + echo ls y.sh
  36. PRG=ls y.sh
  37. + tee -a logfile
  38. + eval ls y.sh
  39. + 2>& 1
  40. + ls y.sh
  41. y.sh
  42. + echo 0
  43. +1> tf
  44. + +cat tf
  45. ret=0
  46. + rm tf
  47. + [ 0 -ne 0 ]
  48. + fdate
  49. + eval elog 20140415-09:44:55 TASK: $TASK2 $PRG2 done with code 0
  50. + elog 20140415-09:44:55 TASK: ls y.sh done with code 0
  51. 20140415-09:44:55 TASK: ls y.sh done with code 0
  52. + i=3
  53. + [ 3 -le 3 ]
  54. + + eval echo $PRG3
  55. + echo fun A B
  56. PRG=fun A B
  57. + tee -a logfile
  58. + eval fun A B
  59. + 2>& 1
  60. + fun A B
  61. arg1 is A
  62. arg2 is B
  63. + echo 0
  64. + +cat tf
  65. +> tf
  66. ret=
  67. + rm tf
  68. +[ -ne 0 ]                                               ####################################
  69. y.sh[55]: test: Specify a parameter with this command.   ###############################
  70. + fdate
  71. + eval elog 20140415-09:44:55 TASK: $TASK3 $PRG3 done with code
  72. + elog 20140415-09:44:55 TASK: fun A B done with code
  73. 20140415-09:44:55 TASK: fun A B done with code
  74. + i=4
  75. + [ 4 -le 3 ]
  76. + fdate
  77. + basename y.sh
  78. + elog \n20140415-09:44:55 y.sh done

  79. 20140415-09:44:55 y.sh done
  80. + quit 0
  81. $  
复制代码
  1. 机器信息
  2. $ uname -a
  3. HP-UX MYNAME B.11.31 U ia64 4178565595 unlimited-user license
复制代码

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2014-04-15 11:41 |显示全部楼层
回复 1# hujysh


    果然还是简化的程序看的懂啊,这个看不懂……

论坛徽章:
0
发表于 2014-04-15 11:54 |显示全部楼层
回复 2# seesea2517


   

这个程序只要关注 P1  P2 的两句
以及测试结果中 标记 ################ 的部分

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2014-04-15 13:14 |显示全部楼层
回复 3# hujysh

我写了个死循环,运行了一分钟也没看出错。跟系统有关系?
  1. while true; do ./y.sh ; sleep 1; done
复制代码

论坛徽章:
0
发表于 2014-04-15 16:19 |显示全部楼层
估计是有关系,我换到AIX的机器没有发现问题,那个HPUX就有问题。
回复 4# seesea2517


   

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2014-04-16 09:25 |显示全部楼层
hujysh 发表于 2014-04-15 16:19
估计是有关系,我换到AIX的机器没有发现问题,那个HPUX就有问题。
回复 4# seesea2517

会不会跟CPU数量有关系呢?这个就太深入了不会。

论坛徽章:
0
发表于 2014-04-16 09:44 |显示全部楼层
为什么会怀疑到CPU数量?
我只怀疑到OS,或者该机器上/bin/sh的设计,它没有遵循语句依次的原则,有漏洞。
具体的说,
cmd;echo $? > file1 | cmd2
cat file1

>file1

cat file1
它没有先后保证顺序。

回复 6# seesea2517


   

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2014-04-16 09:52 |显示全部楼层
回复 7# hujysh


    那就是OS的事吧,这个不懂。

论坛徽章:
6
摩羯座
日期:2013-12-27 09:45:04技术图书徽章
日期:2014-01-27 12:40:06辰龙
日期:2014-02-28 15:12:52巳蛇
日期:2014-03-21 17:06:27未羊
日期:2014-04-15 20:12:41黑曼巴
日期:2016-08-02 11:00:06
发表于 2014-04-16 11:21 |显示全部楼层
本帖最后由 laliheyi 于 2014-04-16 11:23 编辑

回复 1# hujysh

echo 0
+ +cat tf
+> tf

这个操作系统,还能如此,真是神奇了

论坛徽章:
0
发表于 2014-04-16 16:07 来自手机 |显示全部楼层
它貌似随机的,多数情况正常,少数时候抽风。
我理解,它保证了 cmd2 做完再做后面的 ret=$(cat tf),但忽略了判断当时 >tf 这个也许是个新进程 是否已经完成。

我已经换了个方式绕过这个问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP