检查是否从一个bash脚本

检查是否从一个bash脚本

问题描述:

我怎么能确定一个函数在bash脚本已经存在定义的函数?检查是否从一个bash脚本

我试图让系统之间我.bash_login文件脚本便携,所以我想逻辑添加到它是否只存在调用一个函数。

我想补充__git_ps1()PS1仅当系统上存在的功能。这个函数通常在git-completion.bash中定义,该函数附带git源代码,或者由ports/apt安装的bash完成脚本之一。

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

使用`type`比'declare`快得多 - 谢谢。 – csexton 2009-06-22 13:44:33

+4

这几乎是正确的,但如果__get_ps1是别名,内建等,它也会返回“true”。使用`if type -t function_name | grep -q“^ function $”;然后... fi`,以确保`__git_ps1`是一个函数。 – 2011-04-05 13:41:36

可以使用做到这一点:

type function_name 

将返回你的函数定义在它存在的情况下。所以你可以检查输出是否为空。

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

声明-F '函数名'>的/ dev/null的

回声$?

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

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

我认为使用declare更好,即使它比type稍慢。还键入路径中的别名或脚本的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 

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

help compgen 

compgen -A function 

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

我意识到这是一个古老的问题,但其他答案都没有做到这一点,就像我想的那样简单。这使用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 

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

我目前的解决方案已经在其他的答案被部分覆盖:

isFunction() { 
    type $1 | head -1 | egrep "^$1.*function\$" >/dev/null 2>&1; 
    return; 
} 

isFunction __git_ps1 && PS1=__git_ps1 

注意,busybox的(简约于一身壳实现,例如在Windows上使用)有“型”,而是“输入-t”打印错误的东西,所以我只是检查类型的返回值以查看是否有可调用的东西。 busybox也没有声明。