脚本test.sh
:
set -euo pipefail
function _trap_ext
{
echo '_trap_ext'
}
function _trap_error
{
echo '_trap_error'
}
trap "_trap_ext" EXIT
trap "_trap_error" ERR
readonly foo='bar'
foo='bar'
echo 'foobar'
输出:
./test.sh: line 14: foo: readonly variable
_trap_ext
该脚本由于错误(
-e
选项)而在第14行终止,但是未调用_trap_error
函数。为什么不?GNU bash版本4.1.2(1)-发行版(x86_64-unknown-linux-gnu),4.2.45(1)-发行版(i586-suse-linux-gnu)
最佳答案
听起来可能是一个错误。从手册页:
从手册页所说的内容来看,它应该执行ERR陷阱。您可以通过在false
语句之前插入foo='bar'
来测试它在其他情况下是否按预期工作。
同样,bash似乎也不会在语法错误时调用ERR陷阱,因此可能是试图覆盖只读变量属于跳过ERR陷阱的类似错误类别。但是,这种解释纯粹是猜测。
关于bash - 设置只读变量时未调用ERR陷阱,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29348036/