Как определить имя функции внутри функции

Если у меня есть BASH script:

#/bin/bash

f() {
  # echo function name, "f" in this case
}

Есть ли способ сделать это? Это можно использовать в справочных сообщениях, таких как

printf "Usage: %s: blah blah blah \n" $(basename $0) >&2; 

Только в этом случае я не хотел $0, который является именем файла script.

Ответ 1

Вы можете использовать ${FUNCNAME[0]} в bash, чтобы получить имя функции.

Ответ 2

Из справочного руководства Bash:

имя_функции

Переменная массива, содержащая имена всех функций оболочки в настоящее время в стеке выполнения вызовов. Элемент с индексом 0 - это имя любой текущей исполняемой функции оболочки. Самый нижний элемент (тот, который имеет самый высокий индекс) является "основным". Эта переменная существует только при выполнении функции оболочки. Присвоения функции FUNCNAME не влияют и возвращают статус ошибки. Если функция FUNCNAME не установлена, она теряет свои особые свойства, даже если она впоследствии reset.

Эта переменная может использоваться с BASH_LINENO и BASH_SOURCE. Каждый элемент FUNCNAME имеет соответствующие элементы в BASH_LINENO и BASH_SOURCE для описания стека вызовов. Например, ${FUNCNAME [$ i]} вызывается из файла ${BASH_SOURCE [$ я + 1]} при номере строки ${BASH_LINENO [$ i]}. С помощью этой информации встроенный caller отображает текущий стек вызовов.

Когда bash доступны массивы без индекса, будет возвращен первый элемент массива, поэтому $FUNCNAME будет работать в простых случаях, чтобы предоставить имя немедленно текущей функции, но он также содержит все другие функции в стек вызовов. Например:

# in a file "foobar"
function foo {
    echo foo
    echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}

function foobar {
    echo "$(foo)bar"
    echo "In function $FUNCNAME: FUNCNAME=${FUNCNAME[*]}" >&2
}

foobar

Будет выводиться:

$ bash foobar
In function foo: FUNCNAME=foo foobar main
foobar
In function foobar: FUNCNAME=foobar main

Ответ 3

Я использую ${FUNCNAME[0]} для печати текущего имени функции