脚本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)-release(x86_64-unknown-linux-gnu),4.2.45(1)-release(i586-suse-linux-gnu)
答案 0 :(得分:1)
听起来这可能是个错误。从手册页:
<强> -e 强>
如果管道(可能包含单个简单命令),列表或复合命令(请参见上面的SHELL)退出,则退出时会立即退出。
...
ERR上的陷阱(如果已设置)将在shell退出之前执行。此选项分别适用于shell环境和每个子shell环境(请参阅上面的命令环境),并且可能会导致子shell在执行子shell中的所有命令之前退出。
从手册页中可以看出,应执行ERR陷阱。您可以通过在false
语句之前插入foo='bar'
来测试它是否在其他情况下按预期工作。
似乎bash也没有在语法错误上调用ERR陷阱,因此尝试覆盖只读变量可能属于跳过ERR陷阱的类似错误类别。但是,这种解释纯属猜测。