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

时间:2015-03-30 13:53:31

标签: 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'

输出:

./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)

1 个答案:

答案 0 :(得分:1)

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

  

<强> -e
  如果管道(可能包含单个简单命令),列表或复合命令(请参见上面的SHELL)退出,则退出时会立即退出。
  ...
  ERR上的陷阱(如果已设置)将在shell退出之前执行。此选项分别适用于shell环境和每个子shell环境(请参阅上面的命令环境),并且可能会导致子shell在执行子shell中的所有命令之前退出。

从手册页中可以看出,执行ERR陷阱。您可以通过在false语句之前插入foo='bar'来测试它是否在其他情况下按预期工作。

似乎bash也没有在语法错误上调用ERR陷阱,因此尝试覆盖只读变量可能属于跳过ERR陷阱的类似错误类别。但是,这种解释纯属猜测。