在zsh

时间:2015-07-15 09:29:32

标签: bash shell 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...
}

2 个答案:

答案 0 :(得分:1)

(从函数内部)获取函数名称的最简单方法取决于所使用的shell:

Zsh版本

someFunctionName() {
   echo $funcstack[1]
}

bash版本

someFunctionName() {
   echo ${FUNCNAME[0]}
}

两者

someFunctionName() {
  currentShell=$(ps -p $$ | awk "NR==2" | awk '{ print $4 }' | tr -d '-')
  if [[ $currentShell == 'bash' ]]; then
    echo ${FUNCNAME[0]}
  elif [[ $currentShell == 'zsh' ]]; then
    echo $funcstack[1]
  fi
}

答案 1 :(得分:0)

通用解决方案

  • 确定数组索引是从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 d文件中调用此函数时,bash会显示source,而{{1} }会说出源文件的名称。