新闻| 论坛| 博客| 在线研讨会
linux中BASH_SOURCE[0]
电子禅石| 2023-01-11 10:12:16 阅读:7464 发布文章

在C/C++中,__FUNCTION__常量记录当前函数的名称。有时候,在日志输出的时候包含这些信息是非常有用的。而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了。

#!/bin/bash function test_func() { echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})" another_func echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})" } function another_func() { echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})" } echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})" test_func 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就可以派上用场了。

# 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


BASH_SOURCE[0]BASH_SOURCE[0] 等价于BASH_SOURCE, 取得当前执行的shell文件所在的路径及文件名。

在目录/home/sam/linux编程练习/Shell下新建脚本test.sh:

#!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )" # DIR=$( cd "$( dirname ${BASH_SOURCE[0]} )/../" && pwd ) # DIR=`cd $( dirname ${BASH_SOURCE[0]} )/../ && pwd` echo $DIR echo "ok"


执行的时候,需要棵执行权限:chmod +x test.sh 然后执行./test.sh 而不是 sh ./test.sh

经测试以上写都正确:输出

1 /home/sam/linux编程练习 2 ok

其实就是一个:1.取得当前执行的shell文件所在的完整路径 2. 执行dirname,并进入父级目录 3. 打印当前工作目录的过程


1 # echo "${BASH_SOURCE[0]}" 2 # echo "${BASH_SOURCE}" 3 # echo "$( dirname "${BASH_SOURCE[0]}" )" 4 # DIR="$( cd "$( dirname ${BASH_SOURCE[0]} )" && pwd )" 5 # echo $DIR

通过man bash,可以看到bash的特殊用法

1.${BASH_SOURCE-$0}

获取脚本名称

2. ${parameter:-default}

SLAVE_FILE=${HADOOP_SLAVES:-${HADOOP_CONF_DIR}/slaves} 指定默认值

3. ${parameter/pattern/string/}

${@// /\\ }


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
最近文章
签名类型
2024-04-29 16:28:59
cat 文件名
2024-04-29 15:05:34
推荐文章
最近访客