我正在使用 DEBUG陷阱为bash脚本编写自定义调试器。当使用调用者打印堆栈跟踪时,我偶然发现了负数行。
当我在一个从嵌套调用中使用的陷阱方法中调用它时,看起来调用者的输出是不同的。
debug.sh:
d() {
if [[ "${BASH_COMMAND}" == echo* ]] ; then
echo ">> $(caller 0) | $(caller 1) | ${BASH_COMMAND} <<"
fi
}
shopt -s extdebug
set -o functrace
trap d DEBUG
test.sh:
echo foo
f() {
echo bar
}
f
echo end
当我用bash --rcfile debug.sh -i test.sh
调用我的脚本时,我得到了
>> 3 main test.sh | | echo foo <<
foo
>> -2 f test.sh | 8 main test.sh | echo bar <<
bar
>> 10 main test.sh | | echo end <<
end
比较
compare.sh:
echo() {
/bin/echo ">> $(caller 0) | $(caller 1) | echo "$@" <<"
/bin/echo "$@"
}
我在没有陷阱bash --rcfile compare.sh -i test.sh
>> 3 main test.sh | | echo foo <<
foo
>> 1 f test.sh | 8 main test.sh | echo bar <<
bar
>> 10 main test.sh | | echo end <<
end
有一个类似的问题how to get the original caller lineno when executing a function returning a non-zero value错过了对bash行为的解释和为此场景工作的解决方案。
假设bash在陷阱中计算出错误,我已经尝试通过调查函数定义的位置来重新计算正确的元数,但找不到任何合理的方法。