脚本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)
这听起来可能是一个错误。从手册页:
-e
如果管道(可能由单个简单命令组成)、列表或复合命令(请参阅上面的 SHELL)以非零状态退出,则立即退出。
...
如果设置了 ERR 陷阱,则会在 shell 退出之前执行。此选项分别适用于 shell 环境和每个子 shell 环境(请参阅上面的命令环境),并且可能会导致子 shell 在执行子 shell 中的所有命令之前退出。
根据手册页的内容,它应该执行 ERR 陷阱。false您可以通过在语句前插入 来测试它在其他情况下是否按预期工作foo='bar'。
bash 似乎也不会针对语法错误调用 ERR 陷阱,因此尝试覆盖只读变量可能属于跳过 ERR 陷阱的类似错误类别。然而,这种解释纯粹是猜测。