Shell获取当前函数名称


在Bash中,有这样一个常量FUNCNAME,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。FUNCNAME是一个数组,bash中会将它维护成类似一个堆栈的形式。

运行下面的函数

#!/usr/bin/env bash
function fun2(){
  echo ${FUNCNAME[@]}
}

function fun1(){
  fun2
}
main(){
  fun1
}
main

执行结果是

fun2 fun1 main main

由此可见 FUNCNAME[0]是当前函数的名字。{FUNCNAME[0]} 是当前函数的名字。{FUNCNAME[1]} 则是调用它的函数的名字

我们可以这样利用这个变量,我们写一个统一的日志服务函数,打印日志的时候顺便打印一下是哪个方法打印的日志。如下

# debug级别的日志 []<-(msg:String)
function log_debug(){
  echo -e "[$(date +%Y-%m-%dT%H:%M:%S)][$$ $BASHPID][${FUNCNAME[1]}] [DEBUG]:   $*"|trim 1>&2
  echo -e "[$(date +%Y-%m-%dT%H:%M:%S)][$$ $BASHPID][${FUNCNAME[1]}] [DEBUG]:   $*"|trim >> "${LOG_DIR}/$(date +%Y-%m-%d).debug.log" 2>&1
  echo -e "[$(date +%Y-%m-%dT%H:%M:%S)][$$ $BASHPID][${FUNCNAME[1]}] [DEBUG]:   $*"|trim >> "${LOG_DIR}/$(date +%Y-%m-%d).log" 2>&1
}

在脚本中调用 log_debug 函数

function sum(){
  local sum=$(($1+$2))
  log_info "所有数之和是:${sum}"
  echo "${sum}"
}
main(){
  sum 1 2
}

执行结果是

[2019-08-26T22:58:20][62045 62077][sum] [INFO]:    所有数之和是:3

这样就能很方便的知道日志是哪个方法调用的了!还是很方便的

注意:这种做法会让脚本失去一些可移植性,因为不是所有的shell都支持这些常量。


评论