Доброе утро и привет!
В этот прекрасный выходной я научу тебя как узнать имя функции из самой функции.
#!/bin/bash
deploy() {
# здесь хочу получить "deploy"
}
Для получения имени функции из самой функции можно воспользоваться переменной ${FUNCNAME[*]}.
Элемент с индексом 0 — это имя любой выполняемой функции в данный момент. Ну а тот, что имеет самый большой индекс, в моём случае это 1 (так как функция у меня одна), будет называться main.
deploy() {
echo ${FUNCNAME[0]}
}
Выведет название функции: deploy.
Переменная FUNCNAME существует только во время выполнения скрипта. Если самостоятельно задать переменную FUNCNAME, это ничего не даст, и всё равно выведется эталонное имя функции.
При обращении к массиву без индекса будет возвращён первый элемент массива текущей функции. Но также он будет содержать все остальные функции в стеке вызова.
Например:
exp1() {
echo ${FUNCNAME}
}
exp2() {
echo ${FUNCNAME[*]}
}
Первая функция выведет exp1, а вторая выведет весь массив функций: exp2 main.
Как в конце строки ставишь точку с запятой, которая не влияет на функционал программы и вообще никак не интерпретируется.
Ну а в zsh эта штука называется funcstack, это тот же массив всех функций скрипта.
deploy() {
echo $funcstack[1]
}
Ещё переменная FUNCNAME используется с BASH_LINENO и BASH_SOURCE, но про это уже можешь глянуть в официальной документации, как там вся эта магия происходит.
BASH_SOURCE — переменная, содержит путь к исходному файлу оболочки, полезна при отладке и анализе ошибок.
BASH_LINENO — переменная, содержит номер строки, на которой произошла ошибка в текущем скрипте.
Вечером подвезу ещё ништяков. Пойду маркировать интеграции, разгребать бухгалтерию да готовить закупы на следующую неделю. Ещё единомышленников немного сюда приведём. Давай пять, увидимся!








Комментарии