为什么bash调用者在调试陷阱中打印不同的行号

时间:2014-10-09 08:46:36

标签: bash debugging bash-trap

我正在使用 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在陷阱中计算出错误,我已经尝试通过调查函数定义的位置来重新计算正确的元数,但找不到任何合理的方法。

0 个答案:

没有答案