如果你有foo.sh声明一个全局函数:
myfunction(){ echo $*;}
declare -fx myfunction
你来源:
. foo.sh
然后从bar.sh调用全局函数:
myfunction $BASH_SOURCE
myfunction a b c
myfunction $BASH_SOURCE
第三个调用会产生一个空行,除非找到bar.sh。任何想法如何绕过这个问题?
答案 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
中的任何值(以及函数参数的评估都在函数调用之外)是未记录的用法;该变量在那时没有记录值。