如何从函数内部确定函数名称

如果我有这样一个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]}来打印当前的函数名称