Get name of calling function in zsh

2020-07-08 06:56发布

问题:

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...
}

回答1:

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].



回答2:

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 sourced file, bash will say source while zsh will say the name of the file being sourced.



标签: bash shell zsh