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都支持==这些常量。
评论