BASH_SOURCE
在C/C++中,__FUNCTION__常量记录当前函数的名称。有时候,在日志输出的时候包含这些信息是非常有用的。而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了。
1 #!/bin/bash
2
3 function test_func()
4 {
5 echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
6 another_func
7 echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
8 }
9
10 function another_func()
11 {
12 echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
13 }
14
15 echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
16 test_func
17 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就可以派上用场了。
1 # If the script is sourced by another script
2 if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]
3 then
4 do_something
5 else # Otherwise, run directly in the shell
6 do_other
7 fi
BASH_SOURCE[0] BASH_SOURCE[0] 等价于 BASH_SOURCE, 取得当前执行的shell文件所在的路径及文件名。
在目录/home/sam/linux编程练习/Shell下新建脚本test.sh:
1 #!/bin/bash
2 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../" && pwd )"
3 # DIR=$( cd "$( dirname ${BASH_SOURCE[0]} )/../" && pwd )
4 # DIR=`cd $( dirname ${BASH_SOURCE[0]} )/../ && pwd`
5 echo $DIR
6 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/}
BASH_SOURCE的更多相关文章
- BASH_SOURCE 用法
参考 bash少见的用法 http://blog.csdn.net/wonderisland/article/details/22892759. 原有项目里自带的启动脚本用到了bash_source获 ...
- linux中BASH_SOURCE[0]
在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非常有用的.而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非 ...
- linux中BASH_SOURCE[0](转)
转自:http://www.cnblogs.com/sunfie/p/5943979.html 在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非 ...
- SSD框架训练自己的数据集
SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...
- ASP.NET跨平台最佳实践
前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...
- MySQL、MongoDB、Redis数据库Docker镜像制作
MySQL.MongoDB.Redis数据库Docker镜像制作 在多台主机上进行数据库部署时,如果使用传统的MySQL的交互式的安装方式将会重复很多遍.如果做成镜像,那么我们只需要make once ...
- hadoop+tachyon+spark的zybo cluster集群综合配置
1.zybo cluster 架构简述: 1.1 zybo cluster 包含5块zybo 开发板组成一个集群,zybo的boot文件为digilent zybo reference design提 ...
- BASH_SUBSHELL 变量不生效的情况
BASH_SUBSHELL 实现于 Bash 3.0,我一直想不到它在实际编码中有什么用,后来在 Bash 的 Change Log 里找到一句话,才知道它是作调试用的: New variables ...
- NOSDK--一键打包的实现(三)
1.3 编译及拷贝资源的脚本介绍 这一节介绍编译及拷贝资源的shell脚本,即: tools: //保存通用的功 ...
随机推荐
- Xshell5一打开就提示要使用该程序,请更新至最新版本
网上有两种方法 方法一:临时 修改系统时间,修改为一年前的时间即可.但是你会发现修改回当前时间后,xshell又打不开了 方法二:替换xshell文件 找到xshell安装位置,如果是快捷方式,可以右 ...
- java8_api_net
网络编程1 操作ip地址 核心类 InetAddress 相关方法 getByName,getAllByName,getLocalHost 操作socket地址 ...
- springmvc的dispatchservlet初始化
初始化做的事情,处理下controller的映射关系 https://blog.csdn.net/qq_38410730/article/details/79426673
- Spark分布式编程之全局变量专题【共享变量】
转载自:http://www.aboutyun.com/thread-19652-1-1.html 问题导读 1.spark共享变量的作用是什么?2.什么情况下使用共享变量?3.如何在程序中使用共享变 ...
- 【凡尘】---react-redux---【react】
一.Redux与组件 react-redux是一个第三方插件使我们在react上更方便的来使用redux这个数据架构 React-Redux提供connect方法,用于从UI组件生成容器组件,conn ...
- linux如何查看某个端口接收到的数据
lsof -i:11883 可以获得 端口的连接信息 用这个可以按照端口查看详细的收发数据 sudo tcpdump -A -s 0 'tcp port 11883 and (((ip[2:2] - ...
- 嵌入式全志V3s荔枝派板卡移植 aircrack-ng
我使用的是aircrack-ng-1.1.tar.gz这个版本的包. 编辑common.mak,在27行COMMON_FLAGS = 下加入嵌入式开发的环境 -I 和 -L : COMMON_CFLA ...
- 工控随笔_21_西门子_WinCC的VBS脚本_10_对象_01
最近有点小忙,各种事情,心情也不是很好,烦心事特别多,因此最近更新的比较慢. 不敢再松懈了,今天正好有点时间,就继续看了一下VBScript中关于对象的一些内容. 一.对象 OOP是编程规模发展到一定 ...
- JavaScript问题——在浏览器中每一个元素都有一个offsetParent属性,这个属性是什么?
原文链接http://www.cnblogs.com/zcjnever/archive/2011/04/21/2023133.html Javascript中的offsetParent属性 支持的浏览 ...
- Error in loadNamespace 的解决之道
Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) 在构建比较复杂的环 ...