在Bash中,有这样一个常量FUNCNAME,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。FUNCNAME是一个数组,bash中会将它维护成类似一个堆栈的形式。
运行下面的函数
#!/usr/bin/env bash
function fun2(){
echo ${FUNCNAME[@]}
}
function fun1(){
fun2
}
main(){
fun1
}
main
执行结果是
fun2 fun1 main main
由此可见 {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都支持这些常量。