Почему вызывающий 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 вычисляет что-то неправильное в ловушке, я уже пытался пересчитать правильные номера белья, исследуя, где лежат определения функций, но не смог найти разумного пути.