Ответ 1
Вы можете использовать ${FUNCNAME[0]}
в bash
, чтобы получить имя функции.
Если у меня есть BASH script:
#/bin/bash
f() {
# echo function name, "f" in this case
}
Есть ли способ сделать это? Это можно использовать в справочных сообщениях, таких как
printf "Usage: %s: blah blah blah \n" $(basename $0) >&2;
Только в этом случае я не хотел $0
, который является именем файла script.
Вы можете использовать ${FUNCNAME[0]}
в bash
, чтобы получить имя функции.
Из справочного руководства 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
Я использую ${FUNCNAME[0]}
для печати текущего имени функции