Shell之$0、BASH_SOURCE、FUNCNAME

获取脚本路径分析

{BASH_SOURCE}

​ BASH_SOURCE,是一个数组,不过它的第一个元素是当前脚本的名称。这在source的时候非常有用,因为在被source的脚本中,$0是父脚本的名称,而不是被source的脚本名称,BASH_SOURCE[0] 等价于 BASH_SOURCE, 取得当前执行的shell文件所在的路径及文件名

# BASH_SOURCE表示的是用户所在的目录到脚本的路径
[root@jiayu ~]# cat source.sh 
#!/bin/bash
echo ${BASH_SOURCE}
####################
[root@jiayu ~]# bash source.sh 
source.sh
[root@jiayu ~]# bash /root/source.sh 
/root/source.sh
[root@jiayu ~]# source source.sh 
source.sh
[root@jiayu ~]# source /root/source.sh 
/root/source.sh

$0

# 可以发现当脚本被source执行的时候,$0并不是脚本名字了,而是-bash了
[root@jiayu ~]# cat test.sh 
#!/bin/bash
echo $0
[root@jiayu ~]# bash test.sh 
test.sh
[root@jiayu ~]# source test.sh 
-bash
[root@jiayu ~]# bash /root/test.sh 
/root/test.sh

区分source和bash加载

方法一

[root@jiayu ~]# cat example.sh 
#!/bin/bash
script_name=$( basename ${0#-} ) #- needed if sourced no path
this_script=$( basename ${BASH_SOURCE} )
if [[ ${script_name} = ${this_script} ]] ; then
    echo "running me directly"
else
    echo "sourced from ${script_name}"
fi 
[root@jiayu ~]# cat example2.sh 
#!/bin/bash
. ./example.sh
======================
[root@jiayu ~]# bash example.sh 
running me directly
[root@jiayu ~]# source example.sh 
sourced from bash

======================
[root@jiayu ~]# bash example2.sh 
sourced from example2.sh

方法二

[root@jiayu ~]# cat test.sh 
#!/bin/bash
function func1(){
        echo "func1................"
        echo ${FUNCNAME[@]}
        echo ${FUNCNAME[0]}
        echo ${FUNCNAME[1]}
}
function func2(){
        func1
        echo "func2................"
        echo ${FUNCNAME[@]}
        echo ${FUNCNAME[0]}
        echo ${FUNCNAME[1]}
}
func2
================================
[root@jiayu ~]# bash test.sh 
func1................
func1 func2 main
func1
func2
func2................
func2 main
func2
main
# 可以发现没有被其他函数调用的${FUNCNAME[@]} 只有二个值,一个是本身函数值和调用改函数的main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔_牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值