在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/}

${@// /\\ }

linux中BASH_SOURCE[0]的更多相关文章

  1. linux中BASH_SOURCE[0](转)

    转自:http://www.cnblogs.com/sunfie/p/5943979.html 在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非 ...

  2. Linux中Zabbix4.0的搭建

    Zabbix简介 Zabbix是一个高度集成的企业级开源网络监控解决方案,与Cacti.nagios类似,提供分布式监控以及集中的web管理界面.zabbix具备常见商业监控软件所具备的功能,例如主机 ...

  3. Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义【转】

    转自:http://www.cnblogs.com/kaituorensheng/p/4002697.html 1 2 3 4 5 6 7 8 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 ...

  4. Linux中变量#,@,0,1,2,*,$$,$?的含义

    $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该shell脚本的第一个参数 $ 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向 ...

  5. Linux中变量#,#,@,0,0,1,2,2,*,$$,$?的含义

    $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示 ...

  6. Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义(转载)

    From:http://dadekey.blog.51cto.com/107327/119938 我们先写一个简单的脚本,执行以后再解释各个变量的意义   # touch variable # vi ...

  7. 【转】Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义

    原文网址:http://dadekey.blog.51cto.com/107327/119938 我们先写一个简单的脚本,执行以后再解释各个变量的意义   # touch variable # vi ...

  8. Linux中变量#,@,0,1,2,*,$$,$?的意思

    $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示 ...

  9. Linux中执行脚本参数获取

    Linux中变量$[#,@,0,1,2,*,$,?]含义 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $ ...

随机推荐

  1. java静态成员的初始化过程

    public class Price{ final static Price INSTANCE = new Price(2.8); static double initPrice = 20; doub ...

  2. spring mvc ajax

    <%@ page contentType="text/html;charset=UTF-8" %> <%@ include file="/WEB-INF ...

  3. Niagara AX之axvelocity的使用

    axvelocity是一个Web模板引擎模块,来源于Apache Velocity.由于我的Niagara AX的许可没有axvelocity,因此,在palette中没有找到axvelocity. ...

  4. java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet

  5. makefile 单独编译一个文件

    #!/sh/bin .SUFFIXES:.c.o CDIR = /Users/shelley/c BINDIR = $(CDIR)/bin CC = gcc CFLAGS = -g -O RM = r ...

  6. 编程修养-C语言篇(二)

    1.版权和版本——————— 好的程序员会给自己的每个函数,每个文件,都注上版权和版本.  对于C/C++的文件,文件头应该有类似这样的注释: /*************************** ...

  7. centos 6.5 安装 redis

    下载软件: wget wget http://download.redis.io/releases/redis-2.8.7.tar.gz 2.解压软件并编译安装: tar -zxvf redis-2. ...

  8. Ubuntu14.04LST 安装Oracle SQL Developer 4.0.2

    1:Oracle SQL Developer 4.0.2下载链接: http://www.oracle.com/technetwork/developer-tools/sql-developer/do ...

  9. linux系统文件夹的作用 good

    /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 如:环境变量 /etc/rc.d 启动的配置文件和脚本 /home用户主目录的基点,比如用户user的主目录就是/ho ...

  10. 狗屎的asp.net core 果然发生了重大的变更

    狗屎的asp.net core  果然发生了重大的变更 ....仔细看官方的文档,想骂娘....你发布版本的时候,能不能先想好先设计好再发布?朝三暮四...大撒笔....你老这样变来变去,谁还敢碰你啊 ...