TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.52K subscribers
Post #632 515
BASH_SOURCE и FUNCNAME: как понять, откуда реально вызвали функцию

В больших Bash-скриптах функция может вызываться из другой функции, которая пришла из отдельного файла. Обычный $0 в такой ситуации мало что объясняет.

Для этого у Bash есть специальные массивы:

BASH_SOURCE
FUNCNAME


▪️Простой пример

foo() {
echo "file: ${BASH_SOURCE[0]}"
echo "caller: ${BASH_SOURCE[1]}"
echo "function: ${FUNCNAME[0]}"
}

foo


BASH_SOURCE[0] показывает файл, в котором выполняется текущая функция, а BASH_SOURCE[1] - файл, откуда она была вызвана.

▪️Посмотреть весь стек вызовов

foo() {
printf '%s\n' "${FUNCNAME[@]}"
}

bar() {
foo
}

bar


Можно получить примерно:

foo
bar
main


То есть Bash хранит стек функций.

▪️Особенно полезно для логирования

Например:

log() {
printf '[%s] %s: %s\n' \
"$(date '+%F %T')" \
"${FUNCNAME[1]}" \
"$*"
}


Теперь:

deploy() {
log "starting deployment"
}

deploy


может вывести:

[2026-08-24 12:30:01] deploy: starting deployment


Лог сразу показывает, какая функция создала сообщение.

▪️А если скрипт состоит из нескольких файлов

Допустим:

main.sh
lib.sh
utils.sh


и функции вызывают друг друга через source.

Тогда:

printf '%s\n' "${BASH_SOURCE[@]}"


покажет цепочку файлов, через которые прошёл вызов.

▪️Чем это отличается от $0

echo "$0"


обычно показывает имя запущенного скрипта или shell.

А:

echo "${BASH_SOURCE[0]}"


показывает конкретный Bash-файл, где находится текущий код.

Это особенно заметно при использовании:

source lib.sh


▪️Почему это важно

При отладке больших shell-проектов сообщение вроде:

ERROR: failed

почти бесполезно.

А:

ERROR: deploy() in lib/deploy.sh

уже позволяет быстро найти источник проблемы.
BASH_SOURCE и FUNCNAME превращают Bash-функции из непрозрачного набора вызовов в трассируемый стек.

BashTex 📱 #bash #linux
  • 👍 6
More from @bash_tex
  1. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  2. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  3. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  4. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  5. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  6. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →