linux shell 脚本 获取当前函数名

悠悠 2021-08-27 19:16 813阅读 0赞

linux bash shell 中

$FUNCNAME 得到当前函数名

${FUNCNAME[1]} 得到上一层函数名 如果上层没有函数调用 则为空

在C/C++中,__FUNCTION__常量记录当前函数的名称。有时候,在日志输出的时候包含这些信息是非常有用的。而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。

可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了。

  1. #!/bin/bash
  2. function test_func()
  3. {
  4. echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
  5. another_func
  6. echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
  7. }
  8. function another_func()
  9. {
  10. echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
  11. }
  12. echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
  13. test_func
  14. echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"

执行后的结果为:

  1. Out of function, $FUNCNAME => ()
  2. Current test_func, $FUNCNAME => (test_func main)
  3. Current another_func, $FUNCNAME => (another_func test_func main)
  4. Current test_func, $FUNCNAME => (test_func main)
  5. Out of function, $FUNCNAME => ()

所以,更加准确地说,FUNCNAME是一个数组,但是bash中会将它维护成类似一个堆栈的形式。

与FUNCNAME相似的另外一个比较有用的常量是BASH_SOURCE,同样是一个数组,不过它的第一个元素是当前脚本的名称。
这在source的时候非常有用,因为在被source的脚本中,$0是父脚本的名称,而不是被source的脚本名称。而BASH_SOURCE
就可以派上用场了。

  1. # If the script is sourced by another script
  2. if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]
  3. then
  4. do_something
  5. else # Otherwise, run directly in the shell
  6. do_other
  7. fi

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

发表评论

表情:
评论列表 (有 0 条评论,813人围观)

还没有评论,来说两句吧...

相关阅读