尽管set -e和/或trap处于活动状态,但未捕获Bash退出状态

拉斐尔·格隆

有人可以在下面的代码片段中解释bash / set -e行为吗?

#!/bin/bash

# Comment if you want to test the trap only
set -e -o pipefail -u -E

# Comment if you want to test the set -e only
trap "echo ERROR CAUGHT; exit 12" ERR

function reproduce() {
    # Trigger arithmetic error on purpose
    a=$((1109962735 - hello=12272 + 1))
}

reproduce

# The script is expected to trigger the trap and/or activate the set -e. In both cases it should stop and exit here on error.

status_code=$?
echo "STATUS ${status_code}"
if [[ "${status_code}" != "0" ]];then
    echo "FIXME: why was status code not caught by set -e ?"
    echo "Executing false to prove set -e is still active"
    false
    # If the following is not executed then it proves -e is still active
    echo "set -e not active !!!!!"
    exit 2
fi

这是执行时获得的结果:

$ bash reproduce.sh
reproduce.sh: line 8: 1109962735 - hello=12272 + 1: attempted assignment to non-variable (error token is "=12272 + 1")
STATUS 1
FIXME: why was status code it not caught by set -e ?
Executing false to prove set -e is still active
ERROR CAUGHT

检查退出代码

$ echo $?
1

重击版本

bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

转载也

GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

与注释有关的其他注释(无论如何都要感谢所有建议):

  • 评论陷阱不会改变观察到的怪异行为
  • 删除set -e仅保留陷阱不会触发陷阱
oguz ismail

让我们简化一下;重现您正在处理的问题所需的最少代码量为

set -e
: $((+)) # arithmetic expansion error
echo survived

根据标准,这绝不应该打印survived它说非交互式运行的POSIX shell应该在发生扩展错误时立即退出但是貌似Bash并不这么认为。尽管此差异未在手册页中明确记录,但在POSIX模式的描述中却说

  1. 如果算术扩展中的语法错误导致表达式无效,则会退出非交互式外壳程序。

我们可以说这意味着在其默认操作模式下,非交互式Bash会话不会在此类错误时退出,但是正如您所意识到的,它也不会触发errexit机制或ERR陷阱。而是将非零值分配给继续$?前进。

为了克服这个问题并获得预期的行为,您应该定义reproduce如下

function reproduce() (
    # Trigger arithmetic error on purpose
    a=$((1109962735 - hello=12272 + 1))
)

这样,扩展错误将在子shell中发生,并使其以非零状态退出,因此errexit和trap将能够捕获该错误。


根据dash-o的请求,这是一个a在表达式有效时为当前执行环境设置的版本

function reproduce() {
    if : $((expression)); then
        a=$((expression))
    fi
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JQuery手风琴在文档加载时处于活动状态,而不是在单击时处于活动状态,尽管活动状态为false

来自分类Dev

程序以状态!= 0(set -e)退出后执行EXIT陷阱时的Bash函数作用域状态

来自分类Dev

sylius:install:警告:ini_set():会话处于活动状态

来自分类Dev

sylius:install:警告:ini_set():会话处于活动状态

来自分类Dev

尽管超时为0L,但Executors.newSingleThreadExecutor()线程仍处于活动状态

来自分类Dev

尽管 TMUX 会话处于活动状态,为什么我的远程连接停止工作?

来自分类Dev

尽管存在Set-cookie标头,但未设置Laravel Cookie

来自分类Dev

尽管处于打开状态,ofstream无法打印

来自分类Dev

尽管父作业成功,但Hangfire ContinueWithJob仍处于等待状态

来自分类Dev

Bash else / if捕获退出状态

来自分类Dev

.DS_Store尽管处于.gitignore状态,但仍显示为git状态

来自分类Dev

我在magento中的模块处于活动状态,但未显示

来自分类Dev

UFW处于活动状态但未启用,为什么?

来自分类Dev

尽管在高级电源设置中关闭了休眠模式,我的Windows平板电脑仍处于休眠状态

来自分类Dev

尽管Skype联系人处于联机状态,但它们仍显示为脱机

来自分类Dev

示例生成的进程处于活动状态并退出代码

来自分类Dev

使div处于活动状态

来自分类Dev

尽管HandleProcessCorruptedStateExceptions仍未捕获AccessViolationException

来自分类Dev

哪个窗口处于活动状态

来自分类Dev

保持TileService处于活动状态?

来自分类Dev

替换的片段仍处于活动状态

来自分类Dev

单击使按钮处于活动状态

来自分类Dev

wxPython处于非活动状态?

来自分类Dev

虚拟环境和基本环境同时处于活动状态

来自分类Dev

如果使用JQuery和Ajax使数据处于活动状态或不活动状态,如何使dataTable排序?

来自分类Dev

CSS3使部分悬停处于活动状态和非活动状态

来自分类Dev

WordPress插件处于活动状态,但未在管理工具中签入

来自分类Dev

尽管使用realm.beginTransaction()来获取非法状态异常

来自分类Dev

尽管存在服务,但未注入依赖项

Related 相关文章

  1. 1

    JQuery手风琴在文档加载时处于活动状态,而不是在单击时处于活动状态,尽管活动状态为false

  2. 2

    程序以状态!= 0(set -e)退出后执行EXIT陷阱时的Bash函数作用域状态

  3. 3

    sylius:install:警告:ini_set():会话处于活动状态

  4. 4

    sylius:install:警告:ini_set():会话处于活动状态

  5. 5

    尽管超时为0L,但Executors.newSingleThreadExecutor()线程仍处于活动状态

  6. 6

    尽管 TMUX 会话处于活动状态,为什么我的远程连接停止工作?

  7. 7

    尽管存在Set-cookie标头,但未设置Laravel Cookie

  8. 8

    尽管处于打开状态,ofstream无法打印

  9. 9

    尽管父作业成功,但Hangfire ContinueWithJob仍处于等待状态

  10. 10

    Bash else / if捕获退出状态

  11. 11

    .DS_Store尽管处于.gitignore状态,但仍显示为git状态

  12. 12

    我在magento中的模块处于活动状态,但未显示

  13. 13

    UFW处于活动状态但未启用,为什么?

  14. 14

    尽管在高级电源设置中关闭了休眠模式,我的Windows平板电脑仍处于休眠状态

  15. 15

    尽管Skype联系人处于联机状态,但它们仍显示为脱机

  16. 16

    示例生成的进程处于活动状态并退出代码

  17. 17

    使div处于活动状态

  18. 18

    尽管HandleProcessCorruptedStateExceptions仍未捕获AccessViolationException

  19. 19

    哪个窗口处于活动状态

  20. 20

    保持TileService处于活动状态?

  21. 21

    替换的片段仍处于活动状态

  22. 22

    单击使按钮处于活动状态

  23. 23

    wxPython处于非活动状态?

  24. 24

    虚拟环境和基本环境同时处于活动状态

  25. 25

    如果使用JQuery和Ajax使数据处于活动状态或不活动状态,如何使dataTable排序?

  26. 26

    CSS3使部分悬停处于活动状态和非活动状态

  27. 27

    WordPress插件处于活动状态,但未在管理工具中签入

  28. 28

    尽管使用realm.beginTransaction()来获取非法状态异常

  29. 29

    尽管存在服务,但未注入依赖项

热门标签

归档