Как показать определение функции zsh (например, bash "type myfunc")?

как показать определение функции в zsh? type foo не дает определения.

В Баш:

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 ответов


идиома zsh whence на -f флаг печатает определения функции:

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

в zsh,type определяется как эквивалент whence -v, так что вы можете продолжать использовать type, но вам нужно будет использовать , так что which foo даст те же результаты.

man zshbuiltins для всех этот.


Я всегда просто использовать which для этого.


tl; dr

declare -f foo  # works in zsh and bash

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

type -f / whence -f / which are suboptimal в этом случае, потому что их цель состоит в том, чтобы сообщить форму команды с наивысший приоритет это случайно определяется на имя (если не указать -a в этом случае все сообщаются командные формы) - в отличие от конкретной отчетности по операнду как функции.

на -f опция не меняет этого - это только включает в себя функции оболочки в поиске.

псевдонимы и ключевые слова оболочки имеют более высокий приоритет, чем функции оболочки, поэтому в данном случае, если псевдоним foo были и определена type -f foo сообщали псевдоним определение.

отметим, что zsh по умолчанию разворачивает псевдонимы в скриптах (как и ksh, но не bash), и даже если вы сначала отключите расширение псевдонима,type -f / whence -f / which еще сначала сообщите псевдонимы.


Если вы не совсем уверены, что вы ищете, вы можете ввести просто

functions

и он покажет вам все функции.

обратите внимание, что иногда их много, поэтому вы можете передать программу пейджера:

functions | less

чтобы определить функцию, используйте

unfunction functionname