【问题标题】:Get name of calling function in zsh获取 zsh 中调用函数的名称
【发布时间】:2015-07-15 09:29:32
【问题描述】:

有时我想在 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...
}

【问题讨论】:

标签: zsh


【解决方案1】:

函数调用栈在变量$funcstack[]中。

$ f(){echo $funcstack[1];}
$ f
f

所以在c 中,调用函数(ab)是$funcstack[2],或者更方便的是$funcstack[-1]

【讨论】:

  • zsh 数组索引从 1 开始。有一个兼容性选项 KSH_ARRAYS 从 0 开始。
  • 我的编辑${funcstack[1]} 只需要emulate sh。抱歉,我不知道如何恢复它。
  • @TomHale 看来您必须再次编辑,然后在要返回的版本上单击 rollback。我刚刚做了,希望它不会给你任何扣分。谢谢。
  • 我不得不重新阅读你答案的第二部分三遍才能理解它,因为你混合了问题和答案中的函数名称。答案将受益于改写它。
【解决方案2】:

通用解决方案

  • 无论数组索引从 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 之间的区别在于,当从sourced 文件中调用此函数时,bash 会说source,而zsh 会说正在获取的文件的名称。

【讨论】:

    猜你喜欢
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多