获取脚本路径分析
{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