【问题标题】:How to show zsh function definition (like bash "type myfunc")?如何显示 zsh 函数定义(如 bash “type myfunc”)?
【发布时间】:2012-07-13 18:54:00
【问题描述】:

如何在 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;背景见my answer

标签: bash function zsh definition


【解决方案1】:

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$

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

man zshbuiltins 所有这些。

【讨论】:

  • "whence" 只返回函数的名称。它不显示函数定义。
  • @RobBednark 仔细观察:-f 用于答案,它确实打印函数定义
  • type -f foo 也这样做; type 等价于whence -v
  • 我明白了,“whence -f foo”确实给出了我正在寻找的行为。相当于 Thor 的“which foo”。
  • @pb2q,3 种不同方式的详细信息以及参考。谢谢!
【解决方案2】:

我一直只使用which

【讨论】:

  • "which" 给出了我正在寻找的行为——谢谢雷神! (请注意,“which”是一个 zsh 内置函数,而在 bash 中它调用 /usr/bin/which 和 /usr/bin/which 具有与 zsh 内置函数“which”不同的行为)
  • 有效,但前提是碰巧没有定义同名别名,在这种情况下会报告 thatwhich 报告命令的最高优先级形式)。
【解决方案3】:

如果您不太确定要查找的内容,可以直接输入

functions

它会显示所有定义的函数。

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

functions | less

要取消定义函数,请使用

unfunction functionname

【讨论】:

  • +1;请注意,functions 等价于 typeset -f-M 选项除外),因此您甚至可以使用语法稍有反直觉的命令 functions foo 来获取有关 given 函数的信息.
【解决方案4】:

tl;dr

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 在这种情况下是次优的,因为它们的目的是报告具有 最高优先级 恰好被定义的命令表单 em> 使用该名称 - 而不是专门将操作数报告为 函数

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

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

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

bashksh 中,type -f 实际上从查找中排除函数; whencebash 中不存在,在ksh 中它不打印函数定义which 不是kshbash 中的内置函数,并且根据定义,外部实用程序无法打印shell 函数。

【讨论】:

  • 谢谢,@RaineRevere;我已将您的建议添加到答案的顶部,并在底部添加了说明。
猜你喜欢
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 2012-12-01
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多