Bash:如何在错误上获得调用链?

前端之家收集整理的这篇文章主要介绍了Bash:如何在错误上获得调用链?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在bash中有一个后跟踪功能,运行良好(下面的代码),但问题是当它遇到错误时bash本身,它没有给出回溯或任何有助于确定调用者的信息,可以帮助调试问题.

例如.:

./c.sh: line 23: urgh: command not found

function backtrace () {
    local deptn=${#FUNCNAME[@]}

    for ((i=1; i<$deptn; i++)); do
        local func="${FUNCNAME[$i]}"
        local line="${BASH_LINENO[$((i-1))]}"
        local src="${BASH_SOURCE[$((i-1))]}"
        printf '%*s' $i '' # indent
        echo "at: $func(),$src,line $line"
    done
}

是否有可能在这些错误上捕获bash所以我可以调用自己的函数来获得这样的输出

at: c(),./c.sh,line 22
  at: b(),line 11
   at: main(),./b.sh,line 5

更新:建议和跟踪陷阱的最终工作版本出错:

function backtrace () {
    local deptn=${#FUNCNAME[@]}

    for ((i=1; i<$deptn; i++)); do
        local func="${FUNCNAME[$i]}"
        local line="${BASH_LINENO[$((i-1))]}"
        local src="${BASH_SOURCE[$((i-1))]}"
        printf '%*s' $i '' # indent
        echo "at: $func(),line $line"
    done
}

function trace_top_caller () {
    local func="${FUNCNAME[1]}"
    local line="${BASH_LINENO[0]}"
    local src="${BASH_SOURCE[0]}"
    echo "  called from: $func(),line $line"
}

set -o errtrace
trap 'trace_top_caller' ERR
绝对 – 这正是错误陷阱的用途:
trap backtrace ERR

在过去,我隐约回想起有必要让那些东西更像陷阱“回溯”${#BASH_SOURCE [@]}“”${BASH_SOURCE [@]}“”${#BASH_LINENO [@]}“”${BASH_LINENO [@]}“’ERR解决一个错误(并从函数的argv中读取数组值);但是,我现在还不记得那个bug是什么以及它受影响的版本.

猜你在找的Bash相关文章