如果函数所在的文件尚未被获取,是否可以测试该函数是否可以使用?
答案1
在bash
(或ksh
该语法的来源,或zsh
1)中,您可以执行以下操作:
if typeset -f myfunction > /dev/null; then
echo The myfunction function is defined
fi
这也适用于 ksh(该语法来自于此)和 zsh。
在 中zsh
,您还可以执行以下操作:
if (( $+functions[myfunction] )) then
echo The myfunction function is defined
fi
这是测试将函数名称映射到其定义的特殊关联数组中是否存在myfunction
(两种方法也适用于尚未加载的可自动加载函数)。
请注意,如果碰巧也有一个别名,为了能够使用相同名称的函数,您必须引用它或至少引用它的一部分('cmd' args
而不是cmd args
)。同样的情况也适用于 shell 保留字,但 bash 无论如何都不允许您定义与保留字同名的函数。
正如 @JJao 在评论中所建议的,您还可以使用type -t
(在 bash 或最新版本的 ksh93 中)来告诉您命令的类型myfunction
。
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
1 对于yash
,API 略有不同,typeset -f myfunction
返回真的定义函数时不产生输出,否则返回错误的并输出错误消息。您需要typeset -pf myfunction
在 yash 中打印函数的定义(也可以在 ksh/zsh/bash 中使用,尽管-p
在那里不需要)。所以,你需要if typeset -f myfunction 2> /dev/null
。这样做if typeset -f myfunction > /dev/null 2>&1
将使其可移植到所有四个 shell。
答案2
测试结果
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
$
答案3
对于代码的可读性和精度,我更喜欢
if [[ "$(type -t myfunction)" = "function" ]] ; then
# the function is defined and accesible
fi
根据type
内置help type
或的描述man bash
。使用 onlytype text
也会在别名、内置函数、文件等中进行搜索,并且对于不需要的对象类型可以返回 0 (true)。