在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

linux bash source 0,linux中BASH_SOURCE[0](转)相关推荐

  1. linux bash 字符串 连接,Linux Bash 中字符串操作

    Linux Bash 中字符串操作 所谓 "子字符串" 就是出现在其它字符串内的字符串. 比如 "3382" 就是 "this is a 3382 t ...

  2. linux kill 子进程6,linux – Bash:杀死子进程中的所有进程

    在bash中,我可以通过$获取最后一个子进程的进程ID(pid)!变量.然后我可以在它完成之前终止这个子进程: (sleep 5) & pid=$! kill -9 $pid 这与广告一样有效 ...

  3. linux的source命令,linux命令之Source命令

    该source命令在当前Shell环境中从指定为其参数的文件中读取并执行命令.将函数,变量和配置文件加载到Shell脚本中很有用. 该source命令在当前Shell环境中从指定为其参数的文件中读取并 ...

  4. linux bash命令_Ultimate Linux命令行指南-Full Bash教程

    linux bash命令 Welcome to our ultimate guide to the Linux Command Line. This tutorial will show you so ...

  5. linux bash安装教程,linux bash命令怎么用?win10 linux bash命令使用教程

    linux bash命令怎么用?微软在win10一周年更新预览版中加入了ubuntu bash命令支持,但是很多用户并不知道怎么使用.今天U大侠小编就针对这个问题给大家介绍下win10系统linux ...

  6. linux bash 漏洞 利用,Linux Bash发现重大漏洞

    Linux Bash发现重大漏洞 Posted: 26. 09. 2014 | Author: QuenyWell | Category: Linux GNU Bourne Again Shell ( ...

  7. linux的source命令,Linux中source命令的用法

    Linux中source命令的用法 Linux系统中,source命令通常用"."来代替,是一个点命令,与一般的命令有所不同,下面小编就给大家介绍下Linux中source命令的用 ...

  8. linux同名文件没有自动替换,linux – bash脚本替换文件中出现的所有占位符

    我正在尝试编写一个bash脚本,用一个同名环境变量替换文件中所有出现的占位符.举个例子,如果我有一个像下面这样的文件-- This is an {{VAR1}} {{VAR2}}. It should ...

  9. 修复linux bash破壳漏洞,Linux系统下如何检测并修复bash中的破壳漏洞​​

    问题:我想要知道我的Linux服务器是否存在bash破壳漏洞,以及如何来保护我的Linux服务器不受破壳漏洞侵袭. 2014年9月24日,一位名叫斯特凡·沙泽拉的安全研究者发现了一个名为"破 ...

最新文章

  1. 03-Java的基础语法
  2. 程序员最想要的高逼格,都藏在这个开源项目里了!
  3. Lucene之Java实战
  4. jenkins 自带环境变量
  5. Background-size完美兼容IE
  6. Levko and Permutation CodeForces - 361B 思维 数论
  7. 【CodeForces - 735B】Urbanization (找规律,思维)
  8. 数据库基础知识——存储过程和函数
  9. 【干货】一文带你看透深度学习框架演进
  10. 转载:技术大停滞——范式春梦中的地球工业文明1:文明与技术
  11. Python3入门视频教程百度网盘
  12. 机器学习系列(11)_决策树挖掘NBA冠军球队数据
  13. android 系统vr,Android系统中的PowerVR成像框架
  14. 数据库练习题目(一)
  15. 动态规划设计方法详解最长递增子序列
  16. 如何分析和研究Log文件
  17. SQL Server数据库插入数据中文显示乱码问题
  18. 蓦然回首,一切都是浮云
  19. [QMT]07-迅投极简版调用教程
  20. 哈哈,真实山穷水尽疑无路,柳暗花明又一村啊

热门文章

  1. linux nat冲突,Linux系统下的NAT及防火墙的混合应用
  2. c语言osversioninfoex,xi52qian
  3. react动态改变选中不选中_当使用react hooks选中任何复选框时,如何使启用按钮起作用?...
  4. PCM设备E1保护切换功能介绍
  5. 【渝粤教育】21秋期末考试工程项目管理10324k2
  6. 【渝粤题库】陕西师范大学700007 生态学
  7. Linux as4开启telnet,linux as4 虚拟机 上开启 telnet 和ssh 和 ftp 服务
  8. 7500 cpuz跑分 i5_小米Pro笔记本亮相跑分网站:处理器包含AMD Zen3、11代酷睿
  9. 目录页码错误未定义书签怎么解决_目录页码对不齐应该怎么办?这2种方法,工作效率大增...
  10. C++两天一个程序(一)