caller: определение места вызова функции в BashПри отладке больших Bash-скриптов часто недостаточно знать, какая функция упала. Нужно понять, откуда именно она была вызвана.
Для этого есть встроенная команда
caller.▪️Базовый пример
function test_func() {
caller
}
test_funcВывод:
5 mainЭто означает: функция была вызвана из 5-й строки функции
main (или основного скрипта).▪️Использование в логировании ошибок
Например, создаём функцию логирования:
log_error() {
echo "Error from:"
caller
}
backup() {
log_error
}
backupТеперь при ошибке видно не только сообщение, но и источник вызова.
▪️Получение полного стека вызовов
caller умеет подниматься вверх по стеку:function level3() {
caller 0
caller 1
}
function level2() {
level3
}
function level1() {
level2
}
level1caller 0 покажет текущий уровень, а caller 1 - предыдущий.▪️Практический пример с обработчиком ошибок
die() {
echo "Failed at:"
caller
exit 1
}
deploy() {
false || die
}
deployВместо:
Failedполучаем:
Failed at:12 deployСразу понятно, где искать проблему.
▪️Отличие от
$FUNCNAMEВ Bash уже есть массивы:
echo "${FUNCNAME[@]}"Они показывают цепочку функций:
deploy backup main
А
caller дополнительно даёт:номер строки;
имя файла;
контекст вызова.
▪️Где полезно
большие Bash-проекты;
библиотеки функций;
CI/CD-скрипты;
автоматизация с большим количеством уровней вызова.
▪️Почему это важно
В маленьких скриптах ошибка обычно очевидна. Но когда Bash превращается в несколько сотен строк с десятками функций, трассировка вызовов становится такой же важной, как в обычных языках программирования.
caller - простой встроенный инструмент, который превращает отладку Bash из поиска по всему файлу в точное указание места проблемы.BashTex 📱 #bash #linux