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

cse*_*ton 19 bash function

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

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

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

Tre*_*son 15

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

if [ "$(type -t somefunc)" = 'function' ]; then
    somefunc arg1 arg2
fi
Run Code Online (Sandbox Code Playgroud)

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

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


cha*_*aos 10

if type __git_ps1 | grep -q '^function$' 2>/dev/null; then
    PS1=whatever
fi
Run Code Online (Sandbox Code Playgroud)

  • 这几乎是正确的,但如果`__get_ps1`是别名,内置等,它也将返回"true".使用`if type -t function_name | grep -q"^ function $"; 然后... fi`,以确保`__git_ps1`是一个函数. (5认同)
  • 没有理由"grep"; 只运行`type`,如果类型存在与否则返回true/false.而且,真的,如果你使用`type -t`并不重要; 如果定义了(标准)`__git_ps1`,那么这可能就是你想要用于PS1提示的内容,无论它是如何定义的; 即,`if type __git_ps1>/dev/null 2>&1; 然后PS1 ='\n\w $(__ git_ps1)\n \!$'; fi` (5认同)

Art*_*ger 8

你可以使用:

type function_name
Run Code Online (Sandbox Code Playgroud)

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

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


mar*_*cel 6

如果您需要/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
Run Code Online (Sandbox Code Playgroud)


Fri*_*ner 5

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

回声 $?

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