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



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



#!/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 - переменная, содержит номер строки на которой произошла ошибка в текущем скрипте.



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



tags: #linux #bash #debug



💩 @bashdays