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


75

如何在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

declare -f foo即使是在bash中也是更好的选择-它zsh也可以使用;请参阅我的答案作为背景。
mklement0 2014年

Answers:


98

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中的定义等同于whence -c-以类似csh的格式打印结果,因此which foo将产生相同的结果。

man zshbuiltins 对于所有这些。


1
“ whence”仅返回函数的名称。它不显示函数定义。
罗伯·贝德纳克(Rod Bednark)2012年

2
@RobBednark更仔细地看:-f在答案中使用,它确实打印函数定义
pb2q 2012年

type -f foo也这样做;type等价于whence -v
基思·汤普森

我看到,“因此-f foo”确实给出了我想要的行为。相当于雷神的“哪个foo”。
罗伯·贝德纳克(Rod Bednark)2012年

@ pb2q,3种不同方式的详细信息以及参考。谢谢!
罗伯·贝德纳克(Rod Bednark)2012年

22

我一直都在用which这个。


4
“哪个”给出了我正在寻找的行为-感谢Thor!(请注意,“哪个”是zsh内置函数,而在bash中,它调用/ usr / bin / which和/ usr / bin /的行为不同于zsh内置函数“哪个”行为)
Rob Bednark

1
有效,但仅当未定义相同名称的别名时才有效,在这种情况下将进行报告(which报告命令的最高优先级形式)。
mklement0 2014年

16

tl; dr

declare -f foo  # works in zsh and bash

typeset -f foo  # works in zsh, bash, and ksh

type -f/ whence -f/which在这种情况下不理想的,因为他们的目的是报告用命令的形式优先级最高的是恰巧被定义该名称(除非您还指定-a,在这种情况下,所有的命令形式报道) -而不是专门报告在操作数上作为函数

-f选项不会改变它-它仅在查找中包括shell函数。

别名和Shell关键字比壳功能的优先级高,因此,在当前情况下,如果一个别名foo规定,type -f foo将报告的别名定义。

请注意,zsh不会扩大默认脚本别名(一样ksh,但没有bash),即使你把别名扩展关闭第一,type -f/ whence -f/which 还是先上报的别名。


6

如果不确定所要查找的内容,可以键入

functions

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

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

functions | less

要取消定义功能,请使用

unfunction functionname

1
+1; 请注意,functions它等效于typeset -f-M选项除外),因此您甚至可以使用语法上略有反直觉的命令functions foo来获取有关给定功能的信息。
mklement0 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.