Chris Brown
Chris Brown

Reputation: 377

Get name of calling function in 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...
}

Upvotes: 19

Views: 4195

Answers (2)

Tom Hale
Tom Hale

Reputation: 47043

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.

Upvotes: 10

meuh
meuh

Reputation: 12255

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

Upvotes: 33

Related Questions