关于trap ERR的一个bash shell set 参数之二:shopt -s extdebug

本文是之前一篇文章的后续,关于trap ERR在函数调用,命令替换,命令列表()里的应用。

等等,一个trap ERR涉及的太多,以至于经常会片面地去理解并由此产生疑惑 

 

前文提及一个朋友想将trap ERR继续到函数调用里去,并由此引出shell的-e参数(等效于shopt的errtrace)

然后另一个朋友提出了疑问,为何在()产生的子进程里,即使加了errtrace也无法继承trac ERR

 

为此重新查询了man ,bash文档,并且为此纠结了subshell与child process好长时间,

终于发现了问题答案所在:涉及到需要了解的知识点包括

1:bash shell 的trap ERR机制

2:subshell机制

3:shopt的 "errtrace" "extdebug"参数

4:bash的版本更新

等等,下边从这四点慢慢展开说明

 

首先,关于bash shell的trap ERR机制。trap本身是用于捕获信号的,

在信号列表里(kill -l ,或trap -l)里并没有ERR信号,

那么trap ERR是做什么用的,又是从什么时候开始的呢?

man bash和info bash文档里是这么描述trap ERR的:

 

If a SIGSPEC is `ERR', the command ARG is
     executed whenever a simple command has a non-zero exit status,
     subject to the following conditions.

 

联想到shell做为解释器的执行机制,再从trap做为bash的一个builtin来看,

ERR并不是传统的trap信号,而是bash shell一种特殊trap机制,

了解到这点并不能满足我们的好奇,并且带来了更多的疑惑:

 

紧接着问题便是,那trap ERR是否是bash特有的,继续查询文档:

从bash的更新文档(/usr/share/doc/bash-ver/NEWS)里可以看到这么一段:

 

the new features added to bash-2.05a since
the release of bash-2.05.

 

l.  The ksh-like `ERR' trap has been added.  The `ERR' trap will be run
    whenever the shell would have exited if the -e option were enabled.
    It is not inherited by shell functions.

 

说明,bash-2.05a正式采用了ksh的 trap ERR.这个版本的trap ERR是

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值