Как показать определение функции 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
Ответы
Ответ 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
все равно сообщайте псевдонимы.