设置只读变量时不调用ERR陷阱

Tor*_*oru 6 bash shell

脚本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'
Run Code Online (Sandbox Code Playgroud)

输出:

./test.sh: line 14: foo: readonly variable
_trap_ext
Run Code Online (Sandbox Code Playgroud)

由于错误(-e选项),脚本终止于第14行,_trap_error但未调用该函数.为什么不?

GNU bash,版本4.1.2(1)-release(x86_64-unknown-linux-gnu),4.2.45(1)-release(i586-suse-linux-gnu)

Mr.*_*ama 1

这听起来可能是一个错误。从手册页:

-e
如果管道(可能由单个简单命令组成)、列表或复合命令(请参阅上面的 SHELL)以非零状态退出,则立即退出。
...
如果设置了 ERR 陷阱,则会在 shell 退出之前执行。此选项分别适用于 shell 环境和每个子 shell 环境(请参阅上面的命令环境),并且可能会导致子 shell 在执行子 shell 中的所有命令之前退出。

根据手册页的内容,它应该执行 ERR 陷阱。false您可以通过在语句前插入 来测试它在其他情况下是否按预期工作foo='bar'

bash 似乎也不会针对语法错误调用 ERR 陷阱,因此尝试覆盖只读变量可能属于跳过 ERR 陷阱的类似错误类别。然而,这种解释纯粹是猜测。