免费注册 查看新帖 |

Chinaunix

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

为什么在这种情况下, ERR信号不能捕捉到? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-17 14:38 |只看该作者 |倒序浏览
  1. #!/bin/bash

  2. set -o pipefail
  3. set -E

  4. trap 'echo "ERR CATCHED in  LINE: ${LINENO}"' ERR

  5. ls FILE_NOT_EXIST_00

  6. [b]ls FILE_NOT_EXIST_01  | while read LINE ; do
  7.         echo "in while: $LINE"
  8. done[/b]

  9. ls FILE_NOT_EXIST_02 | head

  10. exit 0
复制代码
执行的输出结果是:
  1. ls: cannot access FILE_NOT_EXIST_00: No such file or directory
  2. ERR CATCHED in  LINE: 8
  3. ls: cannot access FILE_NOT_EXIST_01: No such file or directory
  4. ls: cannot access FILE_NOT_EXIST_02: No such file or directory
  5. ERR CATCHED in  LINE: 15
复制代码
ls FILE_NOT_EXIST_01  | while read LINE ;  这个错误没有被捕捉到...  有点奇怪!
我的bash版本是“GNU bash, version 3.2.33(1)-release (i386-redhat-linux-gnu)”

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2011-06-17 15:18 |只看该作者
ls FILE_NOT_EXIST_01 2>&1 | while read LINE

论坛徽章:
0
3 [报告]
发表于 2011-06-17 15:20 |只看该作者
ls FILE_NOT_EXIST_01 2>&1 | while read LINE
ly5066113 发表于 2011-06-17 15:18



    一样哦, 我的意思是问: 为什么在 ls FILE_NOT_EXIST_01 |  while  这种情况下,   ls 产生的错误没有被  trap  ''  ERR 捕捉到~~

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
4 [报告]
发表于 2011-06-17 15:23 |只看该作者
回复 3# binary_XY.Z


哦,原来是这个意思。
没具体研究过 trap ,但估计是因为管道起了子shell的关系。

论坛徽章:
0
5 [报告]
发表于 2011-06-17 15:30 |只看该作者
回复  binary_XY.Z


哦,原来是这个意思。
没具体研究过 trap ,但估计是因为管道起了子shell的关系。 ...
ly5066113 发表于 2011-06-17 15:23



    嗯, 估计是跟sub-shell有关系...  所以我在开头加了 set -E来让错误捕捉也可以继承到sub-shell , 但是在ls FILE_NO_EXIST | while 情况下, ls 产生的错误却不能被捕捉到了, 真是诡异啊..

论坛徽章:
0
6 [报告]
发表于 2011-06-21 10:14 |只看该作者
再顶一顶.. ...
{ ls FILE_NOT_EXIST_01; } | while read LINE ; do

        echo "in while: $LINE"

done
发现用这样, 即管道两边都是sub-shell的情况下, 错误又都能捕捉到了...  真是奇怪了啊...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP