Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get name of calling function in zsh

Tags:

zsh

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...
}
like image 754
Chris Brown Avatar asked Jul 15 '15 09:07

Chris Brown


2 Answers

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

like image 78
meuh Avatar answered Sep 30 '22 04:09

meuh


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.

like image 40
Tom Hale Avatar answered Sep 30 '22 05:09

Tom Hale