如何确定是否已在bash脚本中定义函数?
我试图让我的.bash_login脚本在系统之间移植,所以我想添加逻辑只调用一个函数(如果它存在)。
只有在该系统上存在该功能时,我才想将__git_ps1()
添加到PS1
。此函数通常在git-completion.bash
中定义,它附带git源,或者由ports / apt安装的bash完成脚本之一定义。
答案 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
兼容版本,则无法使用typeset
或declare
来测试函数定义,因为它不是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也没有声明。