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

Rob*_*ark 58 bash zsh function definition

如何在zsh中显示函数的定义?type foo不给出定义.

在bash中:

bash$ function foo() { echo hello; }

bash$ foo
hello

bash$ type foo
foo is a function
foo () 
{ 
    echo hello
}
Run Code Online (Sandbox Code Playgroud)

在zsh中:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a shell function
Run Code Online (Sandbox Code Playgroud)

pb2*_*b2q 72

zsh成语是whence,-f标志打印函数定义:

zsh$ whence -f foo
foo () {
    echo hello
}
zsh$
Run Code Online (Sandbox Code Playgroud)

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

zsh$ type -f foo
foo () {
    echo hello
}
zsh$
Run Code Online (Sandbox Code Playgroud)

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

man zshbuiltins 对于所有这一切.

  • @RobBednark看起来更紧密:`-f`用于答案,它打印函数定义 (2认同)

Tho*_*hor 17

我一直都习惯which这个.

  • "哪个"给出了我正在寻找的行为 - 感谢Thor!(注意"哪个"是zsh内置而在bash中它调用/ usr/bin /,和/ usr/bin /它的行为与zsh内置函数不同"哪个") (4认同)
  • 有效,但前提是没有定义同名的别名,在这种情况下会报告 _that_ (“which”报告命令的最高优先级形式)。 (2认同)

mkl*_*nt0 10

TL;博士

declare -f foo  # works in zsh and bash

typeset -f foo  # works in zsh, bash, and ksh
Run Code Online (Sandbox Code Playgroud)

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

-f选项不会改变它 - 它只包含查找中的shell函数.

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

请注意,zsh默认情况下会在脚本中扩展别名(同样如此ksh,但不会bash),即使先关闭别名扩展,type -f/ whence -f/ which 仍会先报告别名.


Dan*_*tts 6

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

functions
Run Code Online (Sandbox Code Playgroud)

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

请注意,有时会有很多,所以您可能想要管道到寻呼机程序:

functions | less
Run Code Online (Sandbox Code Playgroud)

要取消定义函数,请使用

unfunction functionname
Run Code Online (Sandbox Code Playgroud)

  • +1;请注意,“functions”相当于“typeset -f”(“-M”选项除外),因此您甚至可以使用语法上稍微违反直觉的命令“functions foo”来获取有关给定函数的信息。 (2认同)