检查bash脚本中是否存在函数

时间:2009-06-17 14:50:16

标签: bash function

如何确定是否已在bash脚本中定义函数?

我试图让我的.bash_login脚本在系统之间移植,所以我想添加逻辑只调用一个函数(如果它存在)。

只有在该系统上存在该功能时,我才想将__git_ps1()添加到PS1。此函数通常在git-completion.bash中定义,它附带git源,或者由ports / apt安装的bash完成脚本之一定义。

9 个答案:

答案 0 :(得分:14)

我意识到这是一个老问题,但其他答案都没有像我想的那样简单。这使用type -t(如Chen Levy的评论中所建议的)作为一种有效的测试类型,但是然后使用shell字符串比较而不是调用grep。

if [ "$(type -t somefunc)" = 'function' ]; then
    somefunc arg1 arg2
fi

为了更进一步,它也间接起作用:

funcname=do_it_special_$somehow
if [ "$(type -t $funcname)" != 'function' ]; then
    funcname=do_it_normal
fi
$funcname arg1 arg2

答案 1 :(得分:10)

if type __git_ps1 | grep -q '^function$' 2>/dev/null; then
    PS1=whatever
fi

答案 2 :(得分:8)

您可以使用以下方式执行此操作:

type function_name

in将返回一个函数定义,以防它存在。所以你可以检查输出是否为空。

PS。更好的是我刚检查它会输出该功能不存在,否则输出功能体。

答案 3 :(得分:6)

如果您需要/bin/sh兼容版本,则无法使用typesetdeclare来测试函数定义,因为它不是shell内置函数。此外,-f的{​​{1}}选项可能在某些系统上不可用。

我提出的解决方案已部分涵盖在其他答案中:

type

答案 4 :(得分:4)

声明-F'function_name'>的/ dev / null的

echo $?

$?如果函数存在,则result为0,否则为

答案 5 :(得分:2)

我认为使用declare更好,即使它比type慢一点。对于PATH中的别名或脚本也输入suceeds。

我正在使用它:

function function_exists
{
    FUNCTION_NAME=$1

    [ -z "$FUNCTION_NAME" ] && return 1

    declare -F "$FUNCTION_NAME" > /dev/null 2>&1

    return $?
}

所以稍后在我的脚本中我可以很容易地看到发生了什么:

if function_exists __git_ps1
then
    PS1=__git_ps1
fi

甚至是仍然可读的单行:

function_exists __git_ps1 && PS1=__git_ps1

答案 6 :(得分:1)

您可以列出所有可用功能或使用compgen检查各个功能:

help compgen

compgen -A function

compgen -A function myfunc 1>/dev/null && echo 'myfunc already exists' || exit 1

答案 7 :(得分:0)

if declare -F | grep __git_ps1$
then
    PS1=whatever
fi

答案 8 :(得分:0)

注意,busybox(在一个shell实现中的极简主义,在Windows上很有用)有“type”但是“type -t”打印错误的东西,所以我只检查类型的返回值以查看是否可以调用某些内容。 busybox也没有声明。