Почему вызывающий абонент bash печатает разные номера строк в ловушке отладки

Я пишу собственный отладчик для bash-скриптов, используя ловушку DEBUG. Я наткнулся на отрицательные номера строк при печати трассировки стека с помощью caller.

Кажется, что вывод вызывающего абонента отличается, когда я вызываю его внутри метода-ловушки, который используется из вложенного вызова.

отладка.ш:

d() {
    if [[ "${BASH_COMMAND}" == echo* ]] ; then
        echo ">> $(caller 0) | $(caller 1) | ${BASH_COMMAND} <<"
    fi
}
shopt -s extdebug
set -o functrace
trap d DEBUG

тест.ш:

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

Есть аналогичный вопрос как получить исходную строку вызывающего абонента при выполнении функции, возвращающей ненулевое значение, в которой отсутствует как объяснение поведения bash, так и решение, работающее для этого сценария.

Предполагая, что bash вычисляет что-то неправильное в ловушке, я уже пытался пересчитать правильные номера строк, исследуя, где лежат определения функций, но не смог найти никакого разумного способа.


person Hachi    schedule 09.10.2014    source источник