83

如何在 zsh 中显示函数的定义?type foo没有给出定义。

在 bash 中:

bash$ function foo() { echo hello; }

bash$ foo
hello

bash$ type foo
foo is a function
foo () 
{ 
    echo hello
}

在 zsh 中:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a shell function
4

4 回答 4

110

zsh 习惯用法是whence-f标志打印函数定义:

zsh$ whence -f foo
foo () {
    echo hello
}
zsh$

在 zsh 中,type定义为等价于whence -v,因此您可以继续使用type,但您需要使用-f参数:

zsh$ type -f foo
foo () {
    echo hello
}
zsh$

最后,在 zshwhich中定义为等效于- 以类似 csh 的格式whence -c打印结果,因此将产生相同的结果。which foo

man zshbuiltins对于这一切。

于 2012-07-13T21:36:36.720 回答
27

我一直只是用which这个。

于 2012-07-13T21:38:55.673 回答
19

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 -fwhich因为它们的目的是报告恰好由该名称定义的具有最高优先级的命令形式-不是专门将操作数作为函数报告。

也就是说,实际上这意味着只有同名的别名优先(技术上也是一个shell 关键字,尽管为 shell 关键字命名函数可能是个坏主意)。

请注意,zsh默认情况下会在脚本中扩展别名(如ksh,但不是bash),即使您先关闭别名扩展,//type -f仍会首先报告别名。whence -fwhich

zsh中,该-f选项仅在 中的查找中包含shell 函数zsh,因此 - 除非-a也用于列出所有命令形式 - 给定名称的别名将作为唯一输出打印。

bashandksh中,type -f实际上从查找中排除了函数;whence中不存在bash,并且ksh其中不打印函数定义which不是内置的kshand bash,根据定义,外部实用程序不能打印 shell 函数。

于 2014-11-13T14:49:06.820 回答
7

如果你不太确定你在找什么,你可以只输入

functions

它将向您显示所有已定义的功能。

请注意,有时它们很多,因此您可能希望通过管道传输到寻呼机程序:

functions | less

要取消定义函数,请使用

unfunction functionname
于 2013-05-21T15:12:54.483 回答