bash – 从陷阱RETURN处理程序中访问函数的返回码

在bash中,RETURN处理程序如何访问当前的返回代码?

例如

#!/usr/bin/env bash

function A() {
    function A_ret() {
        # How to access the return code here?
        echo "${FUNCNAME} ???"
    }
    trap A_ret RETURN
    echo -n "${FUNCNAME} returning code $1 ... "
    return $1
}
A 1

这打印

A returning code 1 ... A_ret ???

我想要打印

A returning code 1 ... A_ret 1

A_ret如何访问A返回码?

this stackoverflow question Get the exitcode of the shell script in a “trap EXIT”相似.

最佳答案 看起来RETURN陷阱在return语句实际设置$的新值之前执行.考虑这个设置$的例子?就在退货声明之前.

a () {
    a_ret () {
        echo "${FUNCNAME} $?"
    }
    trap a_ret RETURN
    printf "${FUNCNAME} returning code $1 ... "
    (exit 54)
    return $1
}

a 1

在bash 3.2和4.3中,我得到了输出

a returning code 1 ... a_ret 54

我要说这是一个要报告的错误.作为一种变通方法,您始终可以使用子shell出口以及要返回的值:

a () {
    ...
    (exit $1)
    return $1
}
点赞