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