tl;博士
declare -f foo # works in zsh and bash
typeset -f foo # works in zsh, bash, and ksh
如果您不介意或不喜欢在输出中包含给定名称存在的所有命令形式:谢谢,Raine Revere。
type -af # zsh only (works differently in bash and ksh)
type -f//在这种情况下是次优的whence -f,which因为它们的目的是报告恰好由该名称定义的具有最高优先级的命令形式-而不是专门将操作数作为函数报告。
也就是说,实际上这意味着只有同名的别名优先(技术上也是一个shell 关键字,尽管为 shell 关键字命名函数可能是个坏主意)。
请注意,zsh默认情况下会在脚本中扩展别名(如ksh,但不是bash),即使您先关闭别名扩展,//type -f仍会首先报告别名。whence -fwhich
在zsh中,该-f选项仅在 中的查找中包含shell 函数zsh,因此 - 除非-a也用于列出所有命令形式 - 给定名称的别名将作为唯一输出打印。
在bashandksh中,type -f实际上从查找中排除了函数;whence中不存在bash,并且ksh其中不打印函数定义;which不是内置的kshand bash,根据定义,外部实用程序不能打印 shell 函数。