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

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

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

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

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

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

0 ответов

Другие вопросы по тегам