shell编程:获取当前函数&调用脚本的名称

shell编程  ·  2020-11-28

FUNCNAME变量

在Bash中,有一个常量FUNCNAME,是一个数组而非字符串,第一个元素为当前函数的名称。
可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了。

#!/bin/bash

function test_func()
{
    echo "Current $FUNCNAME, \$FUNCNAME => (${#FUNCNAME[@]})  (${FUNCNAME[@]})"
    another_func
    echo "Current $FUNCNAME, \$FUNCNAME => (${#FUNCNAME[@]})  (${FUNCNAME[@]})"
}

function another_func()
{
    echo "Current $FUNCNAME, \$FUNCNAME => (${#FUNCNAME[@]})  (${FUNCNAME[@]})"
}

echo "Out of function, \$FUNCNAME => (${#FUNCNAME[@]})  (${FUNCNAME[@]})"
test_func
echo "Out of function, \$FUNCNAME => (${#FUNCNAME[@]})  (${FUNCNAME[@]})"
执行后的结果为:
Out of function,      $FUNCNAME => (0)  ()
Current test_func,    $FUNCNAME => (2)  (test_func main)
Current another_func, $FUNCNAME => (3)  (another_func test_func main)   #当前函数, 调用者函数, main
Current test_func,    $FUNCNAME => (2)  (test_func main)
Out of function,      $FUNCNAME => (0)  ()

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

BASH_SOURCE变量

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

# If the script is sourced by another script
if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]
then
    do_something
else # Otherwise, run directly in the shell
    do_other
fi
唯一遗憾的是,这种做法会让脚本失去一些可移植性,因为==不是所有的shell都支持==这些常量。
 
评论
Glab. All Rights Reserved. Theme Jasmine by Kent Liao.