linux中BASH_SOURCE[0]

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

${@// /\\ }

时间: 2024-08-02 02:44:45

linux中BASH_SOURCE[0]的相关文章

linux中BASH_SOURCE[0](转)

转自:http://www.cnblogs.com/sunfie/p/5943979.html 在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非常有用的.而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称.可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了. 1 #!/bin/bash 2 3 function test_fu

linux中的$0 S# $*……的含义

$0 这个程式的执行名字 $n 这个程式的第n个参数值,n=1..9 $* 这个程式的所有参数,此选项参数可超过9个. $# 这个程式的参数个数 $$ 这个程式的PID(脚本运行的当前号) $! 执行上一个背景指令的PID(后台运行的最后一个进程的号) $? 执行上一个指令的返回值 (显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误) $- 显示shell使用的当前选项,与set命令功能相同 [email protected] 跟$*类似,但是可以当作数组用 linux中shell变

linux中Raid 0磁盘阵列的制作

环境: linux版本号 linux内核信息: 步骤1:先添加两块20G的硬盘 步骤2:(1)mdadm -C -v /dev/md0 -l 0 -n 2 /dev/sdb /dev/sdc 温馨提示:如果系统没有mdadm命令,可以yum安装,yum install mdadm -y 注:mdadm是一个用于创建.管理.监控RAID设备的工具,有关mdadm命令可以自行百度 (2) 查看是否成功 (3)mdadm -Ds mdadm -Ds >/etc/mdadm.conf   将输出的信息导

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

$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 [email protected] 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 区别:@@* 相同点:都是引用所有参数 不同点:只有在双引号中体现出来.假设在脚本运行时写了三个参数(分别存储在112

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

$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 [email protected] 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 区别:@* 相同点:都是引用所有参数 不同点:只有在双引号中体现出来.假设在脚本运行时写了三个参数(分别存储在12 3

Linux 中VirtualBox6.0.8 仅主机模式不可用

今天想照着Linux教程在虚拟机上安装一下RHEL(我的主机deepin),结果配置网络为仅主机模式提示一个叹号,提示无效配置,懵逼. 恰好在米聊群里聊天,经人提醒,才会把鼠标移动的警告图片上看提示,实在是汗颜. 提示未指定主机Host-Only的网络界面,往上一瞧,有“界面名称”的项,那就指定一下呗,抱歉选不出来.在把鼠标悬停到未指定这个框上看提示:选择主机中与该网卡通讯的虚拟网卡.您可以使用虚拟机管理窗口中的全局网络管理来创建和移除适配器. 嗯,提示的很清楚么,于是点击菜单栏的 管理>全局设

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

$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 [email protected] 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 [email protected]和$*的区别: 假设shell脚本传递了三个数分别为1 2 3 [email pro

Linux中brk()系统调用,sbrk(),mmap(),malloc(),calloc()的异同【转】

转自:http://blog.csdn.net/kobbee9/article/details/7397010 brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的:       每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的.如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管理

Linux中执行脚本参数获取

Linux中变量$[#,@,0,1,2,*,$,?]含义 $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 [email protected] 是传给脚本的所有参数的列表 $* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 $$ 是脚本运行的当前进程ID号 $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误 区别:[email protected], $* 相同点:都