编辑:
在您的脚本中,添加以下行:
shopt -s extdebug
然后您可以检索源文件名和该文件中函数定义开始的行号:
def=($(declare -F function_1))
echo "function name: ${def[0]}"
echo "line number: ${def[1]}"
echo "file name: ${def[@]:2}" # the array slice makes it work even if the filename contains spaces
原答案:
您不需要在运行时知道哪个文件提供了函数。也许如果您发布您的代码,我们可以更好地了解您的需求。
当您获取文件时(例如使用“. foo.inc”),就好像它实际上在主文件中一样。
如果您出于某种原因需要知道它是否已加载,您可以做一些丑陋的事情(类似于车里的孩子每隔几秒钟就哭喊“我们到了吗?”):
function_check ()
{
local fn found notfound;
for fn in $function_list;
do
if [[ -n $(declare -F $fn) ]]; then
found+=$fn" ";
else
notfound+=$fn" ";
fi;
done;
echo $found;
function_list=$notfound
}
function_list="function_1 function_2 function_3"
. foo.inc
foo_list=$(function_check)
. bar.inc
bar_list=$(function_check)
. baz.inc
baz_list=$(function_check)
echo "Warning: the following functions were not found: $function_list"
函数function_check 检查$function_list 中列出的函数是否存在,如果找到,则回显它们并将它们从列表中删除。 (快说三遍!)
编辑:
这是一种我认为可能与您想要的非常接近的方法:
在您的每个函数中,为一个选项添加一个测试,该选项返回其源代码,如下所示:
function_1 ()
{
if [[ $1 == "--source" ]]
then
echo "source: ${BASH_SOURCE}"
return
fi
# do your function stuff
}
然后在您的脚本中,您可以获取包含函数的文件并找到特定函数的来源:
function_1 --source
将回显它来自的文件名。当然你也可以采取行动:
if [[ $(function_1 --source) == /some/dir/file ]]
then
do_something
fi