Подтвердить что ты не робот

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

Как показать определение функции в 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
4b9b3361

Ответ 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-подобном формате, поэтому which foo даст те же результаты.

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

Ответ 2

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

Ответ 3

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

functions

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

Обратите внимание, что иногда их много, поэтому вы можете подключиться к программе пейджера:

functions | less

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

unfunction functionname

Ответ 4

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 не изменяет этого - он включает только функции оболочки в поиске.

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

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