如果我有这样的BASH脚本:
#!/bin/bash
f() {
# echo function name, "f" in this case
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?这可以用在诸如的帮助消息中
printf "Usage: %s: blah blah blah \n" $(basename $0) >&2;
Run Code Online (Sandbox Code Playgroud)
只有在这种情况下我想要的不是$0,这是脚本的文件名.
bsc*_*ter 71
从Bash参考手册:
FUNCNAME
一个数组变量,包含当前在执行调用堆栈中的所有shell函数的名称.索引为0的元素是当前正在执行的shell函数的名称.最底部的元素(索引最高的元素)是"main".此变量仅在执行shell函数时存在.对FUNCNAME的分配无效并返回错误状态.如果未设置FUNCNAME,则会丢失其特殊属性,即使它随后被重置.
此变量可与BASH_LINENO和BASH_SOURCE一起使用.FUNCNAME的每个元素在BASH_LINENO和BASH_SOURCE中都有对应的元素来描述调用堆栈.例如,$ {FUNCNAME [$ i]}是从行号$ {BASH_LINENO [$ i]}的$ {BASH_SOURCE [$ i + 1]}调用的.内置调用者使用此信息显示当前调用堆栈.
当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
Run Code Online (Sandbox Code Playgroud)
将输出:
$ bash foobar
In function foo: FUNCNAME=foo foobar main
foobar
In function foobar: FUNCNAME=foobar main
Run Code Online (Sandbox Code Playgroud)
jas*_*ard 11
获取函数名称(从函数内部)的最简单方法取决于您使用的 shell:
someFunctionName() {
echo $funcstack[1]
}
Run Code Online (Sandbox Code Playgroud)
someFunctionName() {
echo ${FUNCNAME[0]}
}
Run Code Online (Sandbox Code Playgroud)
someFunctionName() {
currentShell=$(ps -p $$ | awk "NR==2" | awk '{ print $4 }' | tr -d '-')
if [[ $currentShell == 'bash' ]]; then
echo ${FUNCNAME[0]}
elif [[ $currentShell == 'zsh' ]]; then
echo $funcstack[1]
fi
}
Run Code Online (Sandbox Code Playgroud)