获取zsh中调用函数的名称

获取zsh中调用函数的名称,zsh,Zsh,我想在shell脚本中获取函数调用方名称,在bash中它与${FUNCNAME[1]} ${FUNCNAME[1]}是一个(调用方名称) ${FUNCNAME[0]}是c(当前名称) 但它在zsh中不起作用 我想知道在函数c中调用哪个函数 function a(){ c } function b(){ c } function c(){ #if a call me; then... #if b call me; then... } 函数调用堆栈位于变量$

我想在shell脚本中获取函数调用方名称,在bash中它与
${FUNCNAME[1]}

${FUNCNAME[1]}
是一个(调用方名称)

${FUNCNAME[0]}
是c(当前名称)

但它在zsh中不起作用

我想知道在函数c中调用哪个函数

function a(){
    c
}

function b(){
    c
}

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

函数调用堆栈位于变量
$funcstack[]

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

通用解决方案
  • 无论数组索引是从0开始(选项
    KSH\u数组
    )还是从1开始(默认值),都有效
  • zsh
    bash

边缘大小写


bash
zsh
之间的区别在于,当从
源文件
d文件调用此函数时,
bash
将显示
source
,而
zsh
将显示源文件的名称。

zsh数组索引从1开始。有一个兼容性选项
KSH_数组
从0开始。我的编辑
${funcstack[1]}
只需要
仿真sh
。很抱歉,我无法确定如何将其还原。@TomHale您似乎必须再次编辑,然后单击要还原的版本上的“回滚”。我刚刚做到了,希望不会给你带来任何点球。谢谢,复制品,考虑一下我的答案:
# 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
}