检查是否从一个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
可以使用做到这一点:
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
兼容的版本,则不能使用typeset
或declare
来测试一个函数的定义,因为它不是内置的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也没有声明。
使用`type`比'declare`快得多 - 谢谢。 – csexton 2009-06-22 13:44:33
这几乎是正确的,但如果__get_ps1是别名,内建等,它也会返回“true”。使用`if type -t function_name | grep -q“^ function $”;然后... fi`,以确保`__git_ps1`是一个函数。 – 2011-04-05 13:41:36