理解$0和BASH_SOURCE
理解$0和BASH_SOURCE
一个shell(bash)脚本有两种执行方式:
- 直接执行,类似于执行二进制程序
- source加载,类似于加载库文件
$0
保存了被执行脚本的程序名称。注意,它保存的是以二进制方式执行的脚本名而非以source方式加载的脚本名称。
例如,执行a.sh时,a.sh中的$0
的值是a.sh,如果a.sh执行b.sh,b.sh中的$0
的值是b.sh,如果a.sh中source b.sh,则b.sh中的$0
的值为a.sh。
除了$0
,bash还提供了一个数组变量BASH_SOURCE
,该数组保存了bash的SOURCE调用层次。这个层次是怎么体现的,参考下面的示例。
执行shell脚本a.sh时,shell脚本的程序名a.sh
将被添加到BASH_SOURCE
数组的第一个元素中,即${BASH_SOURCE[0]}
的值为a.sh
,这时${BASH_SOURCE[0]}
等价于$0
。
当在a.sh中执行b.sh时:
1 | # a.sh中的$0和BASH_SOURCE |
当在a.sh中source b.sh时:
1 | # a.sh中的$0和BASH_SOURCE |
当在a.sh中source b.sh时,如果b.sh中还执行了source c.sh,那么:
1 | # a.sh中的$0和BASH_SOURCE |
使用脚本来验证一下BASH_SOURCE
和$0
。在x.sh中source y.sh,在y.sh中source z.sh:
1 | #~ /tmp/x.sh |
执行x.sh输出结果:
1 | $ bash /tmp/x.sh |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙!
评论