在我的bash脚本中,有很多包含的libs,我使用这些文件中声明的函数。像这样:
#!/bin/bash
. foo.inc
. bar.inc
. baz.inc
function_1
function_2
function_3
EOF
我的问题是如何学习哪个文件包含function_1声明?在此脚本的运行时。
答案 0 :(得分:1)
你不知道。您必须grep包含的定义文件
答案 1 :(得分:1)
修改强>
在您的脚本中,添加以下行:
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