$ BASH_SOURCE的奇怪行为

时间:2015-01-10 19:04:43

标签: bash function global

如果你有foo.sh声明一个全局函数:

myfunction(){ echo $*;}
declare -fx myfunction

你来源:

. foo.sh

然后从bar.sh调用全局函数:

myfunction $BASH_SOURCE
myfunction a b c
myfunction $BASH_SOURCE

第三个调用会产生一个空行,除非找到bar.sh。任何想法如何绕过这个问题?

2 个答案:

答案 0 :(得分:0)

很奇怪,这绝对看起来像个错误。可能与bash的shell函数导入机制有关(当在环境中序列化shell函数并将其反序列化为新进程时)。

我刚发现,如果您从foo.sh内部bar.sh来源,那么该错误就会消失:

. foo.sh
myfunction ${BASH_SOURCE[@]}
myfunction a b c
myfunction ${BASH_SOURCE[@]}

导致输出

> ./bar.sh
./bar.sh
a b c
./bar.sh

答案 1 :(得分:0)

根据bash手册,BASH_SOURCE是一个数组,其中每个元素都是与FUNCNAME的相应元素相关联的文件名,只有在shell函数执行时才存在" #34;

因此,函数调用之外的BASH_SOURCE中的任何值(以及函数参数的评估都在函数调用之外)是未记录的用法;该变量在那时没有记录值。