使用函数
function fail() {
local msg="$*"
echo $msg at
for i in ${!FUNCNAME[@]}; do
echo " ${FUNCNAME[$i]} ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
done
exit 1
}
当它被调用退出时,我得到了一个很好的堆栈跟踪。如果我能获取调用堆栈上函数的参数,信息量会更大。这可能吗?
使用函数
function fail() {
local msg="$*"
echo $msg at
for i in ${!FUNCNAME[@]}; do
echo " ${FUNCNAME[$i]} ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
done
exit 1
}
当它被调用退出时,我得到了一个很好的堆栈跟踪。如果我能获取调用堆栈上函数的参数,信息量会更大。这可能吗?
Bash 有
BASH_ARGC
和BASH_ARGV
数组来实现这一点。BASH_ARGC
指示调用堆栈中每个函数有多少个参数,BASH_ARGV
并按顺序包含所有函数的参数。两者都需要shopt -s extdebug
启用。只是,函数中的参数
BASH_ARGV
顺序是倒序的,最内层函数的最右边的参数位于索引 0,就像它们被压入堆栈一样,从左到右,堆栈顶部位于索引 0。虽然很巧妙,但使用起来很不方便,因为 Shell 语言没有提供处理这种堆栈的语法,而且你很可能希望先打印最左边的参数。(也就是说,数组切片"${BASH_ARGV[@]:n:m}"
会以倒序的方式提供参数。)例如这个:
将打印
您需要一些索引操作来打印有用的输出,如下所示:
如果
bar
上面调用trace
而不是打印,则应该输出如下的跟踪: