【问题标题】:ERR trap not called when setting readonly variable设置只读变量时未调用 ERR 陷阱
【发布时间】:2015-03-30 13:53:31
【问题描述】:

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

【问题讨论】:

  • FWIW 我在 4.3.33 中没有这个错误,但我也没有在 change log 中看到任何明显表明它已修复的内容。

标签: bash shell


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多