在zsh中获取调用函数的名称

17

有时我想在shell脚本中获取函数调用者的名称,在bash中可以使用${FUNCNAME[1]}实现。

${FUNCNAME[1]}是调用该函数的名称(caller name)。

${FUNCNAME[0]}是当前函数的名称(current name)。

但是在zsh中无法工作。

也就是说,我想知道在函数c中是哪个函数调用了我。

function a(){
    c
}

function b(){
    c
}

function c(){
     #if a call me; then...
     #if b call me; then...
}

请参考我的答案:https://dev59.com/TXI-5IYBdhLWcg3weoPR#62527825。重复回答了。 - jasonleonhard
2个回答

30
函数调用栈存储在变量$funcstack[]中。
$ f(){echo ${funcstack[1]};}
$ f
f

因此,在 c 中,调用函数( a 或 b )是$funcstack [2]或更方便的是$funcstack [-1]


3
zsh 数组的索引从 1 开始。有一个兼容选项 KSH_ARRAYS 可以从 0 开始。 - meuh
我的编辑${funcstack[1]}只有在emulate sh的情况下才需要。抱歉,我不知道如何恢复它。 - Tom Hale
@TomHale 看起来你需要再次编辑,并在想要恢复的版本上点击“回滚”。我刚刚这样做了,希望不会给你造成任何罚分。谢谢。 - meuh
我不得不三次重新阅读你回答的第二部分才理解,因为你混淆了问题和回答中的函数名称。重述一下答案会更有益。 - kotchwane

7

通用解决方案

  • 适用于数组索引从0(选项KSH_ARRAYS)或1(默认)开始的情况
  • 适用于 zshbash

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

边缘情况

bashzsh之间的区别在于,当从一个source文件中调用此函数时,bash会说source,而zsh会说被源化的文件名。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接