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