在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[@]})"

执行后的结果为:

 Out of function, $FUNCNAME => ()
Current test_func, $FUNCNAME => (test_func main)
Current another_func, $FUNCNAME => (another_func test_func main)
Current test_func, $FUNCNAME => (test_func main)
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[]}" )/../" && pwd )"
# DIR=$( cd "$( dirname ${BASH_SOURCE[]} )/../" && pwd )
# DIR=`cd $( dirname ${BASH_SOURCE[]} )/../ && pwd`
echo $DIR
echo "ok"

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

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

 /home/sam/linux编程练习
ok

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

 # echo "${BASH_SOURCE[]}"
# echo "${BASH_SOURCE}"
# echo "$( dirname "${BASH_SOURCE[]}" )"
# DIR="$( cd "$( dirname ${BASH_SOURCE[]} )" && pwd )"
# echo $DIR

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

1.${BASH_SOURCE-$0}

获取脚本名称

2. ${parameter:-default}

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

3. ${parameter/pattern/string/}

${@// /\\ }

最新文章

  1. 《图解HTTP》阅读笔记
  2. Docker:Ubuntu下的安装
  3. windows下jenkins常见问题填坑
  4. mac编辑器快捷键(自己摸索出来的)
  5. Lua 之数据结构
  6. 5分钟教你Windows 10中将“运行”固定到开始菜单
  7. Java_解密ThreadLocal
  8. android:layout_gravity和android:gravity属性的区别
  9. 【BZOJ】【3210】花神的浇花集会
  10. centos安装postfixadmin
  11. jquery ztree插件
  12. arguments,caller,callee之理解
  13. LeetCode之“字符串”:Valid Palindrome
  14. Linux常用基本命令:三剑客命令之-awk模式用法(2)
  15. 用nodejs做一下发送邮件例子
  16. git push 失败出现error: src refspec master does not match any.解决方案
  17. Mysql 6.0安装过程(截图放不上去)
  18. USACO 6.5 Closed Fences
  19. if、for、while、do 等语句自占一行
  20. 构造函数详解,explicit,初始化列表

热门文章

  1. python笔记之常用模块用法分析
  2. information_schema.collations 学习
  3. HQL和Criteria(转)
  4. [分享]我的LABVIEW快速开发串口测试软件实例
  5. [转]从数据库中导出用友U8的现存量数据到Excel表
  6. Ubuntu14.0.4 64位安装Chrome浏览器
  7. Asp.net MVC Web.config配置技巧
  8. javascript之Arguments
  9. 【原创整理,基于JavaScript的创建对象方式的集锦】
  10. JAVA的类加载器,详细解释