Доброе утро и привет!

В этот прекрасный выходной я научу тебя как узнать имя функции из самой функции.

#!/bin/bash

deploy() {
  # здесь хочу получить "deploy"
}

Для получения имени функции из самой функции можно воспользоваться переменной ${FUNCNAME[*]}.

Элемент с индексом 0 — это имя любой выполняемой функции в данный момент. Ну а тот, что имеет самый большой индекс, в моём случае это 1 (так как функция у меня одна), будет называться main.

deploy() {
    echo ${FUNCNAME[0]}
}

Выведет название функции: deploy.

Переменная FUNCNAME существует только во время выполнения скрипта. Если самостоятельно задать переменную FUNCNAME, это ничего не даст, и всё равно выведется эталонное имя функции.

При обращении к массиву без индекса будет возвращён первый элемент массива текущей функции. Но также он будет содержать все остальные функции в стеке вызова.

Например:

exp1() {
    echo ${FUNCNAME}
}

exp2() {
    echo ${FUNCNAME[*]}
}

Первая функция выведет exp1, а вторая выведет весь массив функций: exp2 main.

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Вообще не обязательно указывать индекс, оно будет корректно работать и так. Это больше как кодстайл.

Как в конце строки ставишь точку с запятой, которая не влияет на функционал программы и вообще никак не интерпретируется.

Ну а в zsh эта штука называется funcstack, это тот же массив всех функций скрипта.

deploy() {
   echo $funcstack[1]
}

Ещё переменная FUNCNAME используется с BASH_LINENO и BASH_SOURCE, но про это уже можешь глянуть в официальной документации, как там вся эта магия происходит.

BASH_SOURCE — переменная, содержит путь к исходному файлу оболочки, полезна при отладке и анализе ошибок.

BASH_LINENO — переменная, содержит номер строки, на которой произошла ошибка в текущем скрипте.

Вечером подвезу ещё ништяков. Пойду маркировать интеграции, разгребать бухгалтерию да готовить закупы на следующую неделю. Ещё единомышленников немного сюда приведём. Давай пять, увидимся!