我正在使用DEBUG 陷阱为 bash 脚本编写自定义调试器。在使用调用者打印堆栈跟踪时,我偶然发现了负行号。
当我在嵌套调用中使用的陷阱方法中调用它时,调用者的输出似乎有所不同。
调试.sh:
d() {
if [[ "${BASH_COMMAND}" == echo* ]] ; then
echo ">> $(caller 0) | $(caller 1) | ${BASH_COMMAND} <<"
fi
}
shopt -s extdebug
set -o functrace
trap d DEBUG
测试.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
比较
比较.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
有一个类似的问题,当执行返回非零值的函数时,如何获取原始调用者 lineno既错过了对 bash 行为的解释,也没有解决适用于这种情况的解决方案。
假设 bash 在陷阱中计算错误,我已经尝试通过调查函数定义的位置来重新计算正确的行号,但找不到任何合理的方法。