【问题标题】:Where is function's declaration in bash?bash中函数的声明在哪里?
【发布时间】:2010-11-29 11:13:26
【问题描述】:

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

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

function_1
function_2
function_3

EOF

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

【问题讨论】:

  • 为什么不研究一下 foo.inc、bar.inc 和 baz.inc?
  • 如果我要添加新的包含,我必须在我的搜索功能中添加新代码。

标签: bash function include


【解决方案1】:

你不知道。您必须 grep 定义的包含文件

【讨论】:

  • 那么你不能包含它们。对不起,我不完全理解你的问题。如果你包含你依赖的文件
  • 我不想添加新的 grep,当我包含新的库时... type -t function_1 可以判断这是一个函数 type -f ping 可以判断文件在哪里 可能在那里是一种了解我的函数在哪个文件中定义的方法...?
【解决方案2】:

编辑:

在您的脚本中,添加以下行:

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

【讨论】: