case $(type -t myfunction) in
(function) echo OK;;
(alias) echo might exist as a function but it is first an alias;;
(*) echo cannot be used as a function;;
esac
type functionname
$ if type existingfunction >/dev/null 2>&1 ; then echo yes ; else echo no ; fi
yes
$
$ if type nonexistingfunction >/dev/null 2>&1 ; then echo yes ; else echo no ; fi
no
$
在
bash
(或ksh
该语法的来源,或zsh
¹)中,您可以执行以下操作:这也适用于 ksh(该语法的来源)和 zsh。
在 中
zsh
,您还可以执行以下操作:这是测试在将函数名称映射到它们的定义的特殊关联数组中是否存在
myfunction
(这两种方法也适用于尚未加载的可自动加载函数)。请注意,如果碰巧还有一个别名,为了能够使用相同名称的函数,您必须引用它或至少引用它的一部分(而不是
'cmd' args
)cmd args
。这同样适用于 shell 保留字,但 bash 不允许您定义与保留字同名的函数。正如@JJao 在评论中所建议的那样,您还可以使用
type -t
(在 bash 或 ksh93 的最新版本中)来告诉您命令的类型myfunction
。¹ 对于
yash
,API 略有不同,定义函数时typeset -f myfunction
返回true并且不产生输出,否则返回false并输出错误消息。您需要typeset -pf myfunction
在 yash 中打印函数的定义(也可以在 ksh/zsh/bash 中使用,尽管-p
那里没有必要)。所以在那里,你需要if typeset -f myfunction 2> /dev/null
。这样做if typeset -f myfunction > /dev/null 2>&1
会使它可移植到所有四个 shell。测试结果
为了代码的可读性和精度,我更喜欢
type
根据builtin inhelp type
或的描述man bash
。使用 onlytype text
也会搜索别名、内置函数、文件等,并且可以为不需要的对象返回 0(真)。