bash中的函数声明在哪里?

时间:2009-09-18 11:53:12

标签: bash function include

在我的bash脚本中,有很多包含的libs,我使用这些文件中声明的函数。像这样:

#!/bin/bash
. foo.inc
. bar.inc
. baz.inc

function_1
function_2
function_3

EOF

我的问题是如何学习哪个文件包含function_1声明?在此脚本的运行时。

2 个答案:

答案 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