脚本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/

10-11 02:54
查看更多