I want to get function caller name in shell script sometime, in bash it works with ${FUNCNAME[1]}
${FUNCNAME[1]}
is a (caller name)
${FUNCNAME[0]}
is c (current name)
but it not work in zsh
ie i want to know which function call me in function c
function a(){
c
}
function b(){
c
}
function c(){
#if a call me; then...
#if b call me; then...
}
The function call stack is in the variable $funcstack[]
.
$ f(){echo $funcstack[1];}
$ f
f
So in c
the calling function (a
or b
) is $funcstack[2]
or perhaps more conveniently $funcstack[-1]
.
Generic solution
- Works whether array indexing starts at 0 (option
KSH_ARRAYS
) or 1 (default)
- Works in both
zsh
and bash
# Print the name of the function calling me
function func_name () {
if [[ -n $BASH_VERSION ]]; then
printf "%s\n" "${FUNCNAME[1]}"
else # zsh
# Use offset:length as array indexing may start at 1 or 0
printf "%s\n" "${funcstack[@]:1:1}"
fi
}
Edge case
The difference between bash
and zsh
is that when calling this function from a source
d file, bash
will say source
while zsh
will say the name of the file being sourced.