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

Jam*_*979 6 bash

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

\n\n

例如

\n\n
#!/usr/bin/env bash\n\nfunction A() {\n    function A_ret() {\n        # How to access the return code here?\n        echo "${FUNCNAME} ???"\n    }\n    trap A_ret RETURN\n    echo -n "${FUNCNAME} returning code $1 ... "\n    return $1\n}\nA 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

这打印

\n\n
A returning code 1 ... A_ret ???\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想要打印

\n\n
A returning code 1 ... A_ret 1\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何A_ret获取A返回码?

\n\n


\n\n

类似于此 stackoverflow 问题在 \xe2\x80\x9ctrap EXIT\xe2\x80\x9d 中获取 shell 脚本的退出代码

\n

che*_*ner 5

看起来陷阱是在语句实际设置 的新值RETURN之前执行的。考虑这个在语句之前设置的示例。return$?$?return

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

a 1
Run Code Online (Sandbox Code Playgroud)

bash3.2 和 4.3 中,我得到输出

a returning code 1 ... a_ret 54
Run Code Online (Sandbox Code Playgroud)

我想说这是一个需要报告的错误。作为解决方法,您始终可以将子 shellexit与您想要返回的值一起使用:

a () {
    ...
    (exit $1)
    return $1
}
Run Code Online (Sandbox Code Playgroud)