测试某个函数是否可以使用

测试某个函数是否可以使用

如果函数所在的文件尚未被获取,是否可以测试该函数是否可以使用?

答案1

bash(或ksh该语法的来源,或zsh1)中,您可以执行以下操作:

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)。

相关内容