如何从函数内部确定函数名称
如果我有这样一个BASH脚本:
#/bin/bash f() { # echo function name, "f" in this case }
有没有办法做到这一点? 这可以用于帮助消息,如
printf "Usage: %s: blah blah blah \n" $(basename $0) >&2;
只有在这种情况下我想要的不是$0
,这是脚本的文件名。
您可以在bash
使用${FUNCNAME[0]}
来获取函数名称。
从Bash参考手册 :
FUNCNAME
包含当前执行调用堆栈中所有shell函数名称的数组variables。 索引为0的元素是任何当前正在执行的shell函数的名称。 最底层的元素(索引最高的元素)是“主”。 这个variables只有在shell函数执行时才存在。 对FUNCNAME的分配无效,并返回错误状态。 如果FUNCNAME未设置,即使随后重置,它也会失去其特殊属性。
这个variables可以和BASH_LINENO和BASH_SOURCE一起使用。 FUNCNAME的每个元素在BASH_LINENO和BASH_SOURCE中都有对应的元素来描述调用堆栈。 例如,$ {FUNCNAME [$ i]}在行号$ {BASH_LINENO [$ i]}中的文件$ {BASH_SOURCE [$ i + 1]}被调用。 调用者内build使用此信息显示当前的调用堆栈。
当没有索引访问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]}
来打印当前的函数名称