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

本文详细探讨了bash shell中的trap ERR机制,如何在函数调用、命令替换和子shell中应用。文章指出,trap ERR并非传统信号,而是bash的特殊陷阱机制,从bash 2.05a版本开始引入。bash的-E选项允许trap ERR在函数和子shell中继承,但在某些版本中需要启用调试模式(shopt extdebug)。通过示例代码,展示了不同bash版本中trap ERR的行为差异,揭示了从3.2版本开始,仅需-E即可使trap ERR在子shell中生效。
摘要由CSDN通过智能技术生成

本文是之前一篇文章的后续,关于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是

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值