如何显示zsh函数定义(如bash“type myfunc”)?

如何显示zsh函数定义(如bash“type myfunc”)?,bash,function,zsh,definition,Bash,Function,Zsh,Definition,如何在zsh中显示函数的定义输入foo没有给出定义。 在bash中: 在zsh中: zsh$ function foo() { echo hello; } zsh$ foo hello zsh$ type foo foo is a shell function zsh习惯用法是从哪里,-f标志打印函数定义: zsh$ whence -f foo foo () { echo hello } zsh$ 在zsh中,type被定义为等同于whence-v,因此您可以继续使用type,但

如何在zsh中显示函数的定义<代码>输入foo没有给出定义。 在bash中:

在zsh中:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a shell function

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

zsh$ whence -f foo
foo () {
    echo hello
}
zsh$
在zsh中,
type
被定义为等同于
whence-v
,因此您可以继续使用
type
,但需要使用
-f
参数:

zsh$ type -f foo
foo () {
    echo hello
}
zsh$
最后,在zsh
中,它被定义为等价于
whence-c
,以类似csh的格式打印结果,因此
哪个foo
将产生相同的结果


manzshbuiltins
用于所有这一切。

我一直都在使用
哪一个

如果你不太确定你要找的是什么,你可以直接键入

functions
它将向您显示所有已定义的函数

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

functions | less
要取消定义函数,请使用

unfunction functionname
tl;dr

declare -f foo  # works in zsh and bash

typeset -f foo  # works in zsh, bash, and ksh
如果您不介意或更愿意在输出中包含给定名称的所有命令形式:谢谢


type-f
/
where-f
/
在这种情况下,哪个是次优的,因为它们的目的是报告恰好由该名称定义的具有最高优先级的命令形式,而不是专门报告操作数作为函数

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

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

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


bash
ksh
中,
type-f
实际上从查找中排除函数
从何处
bash
中不存在,在
ksh
中不打印函数定义
不是
ksh
bash
中的内置函数,根据定义,外部实用程序无法打印外壳函数。

“whence”仅返回函数的名称。它不显示函数定义。@RobBednark仔细查看:
-f
用于回答,它打印函数定义
type-f foo
也会打印函数定义
type
相当于
whence-v
。我明白了,“whence-f foo”确实给出了我想要的行为。相当于Thor的“which foo”。@pb2q,3种不同方式的详细信息,以及参考资料。谢谢“它”给出了我想要的行为——谢谢雷神!(请注意,“which”是一个zsh内置函数,而在bash中它调用/usr/bin/which和/usr/bin/which的行为与zsh内置函数“which”不同),但只有在没有定义相同名称的别名的情况下才起作用,在这种情况下会报告该别名(
它报告命令的最高优先级形式).
declare-f foo
即使在bash中也是更好的选择,而且它在
zsh
中也能工作;背景见+1;请注意,
functions
相当于
typeset-f
(除了
-M
选项),因此您甚至可以使用语法上稍有违反直觉的命令
functions foo
来获取有关给定函数的信息;我已经在答案的顶部添加了您的建议,并在底部添加了澄清。
declare -f foo  # works in zsh and bash

typeset -f foo  # works in zsh, bash, and ksh
type -af  # zsh only (works differently in bash and ksh)