How to show zsh function definition (like bash "type myfunc")?

BashFunctionZshDefinition

Bash Problem Overview


How do I show the definition of a function in zsh? type foo doesn't give the definition.

In bash:

bash$ function foo() { echo hello; }

bash$ foo
hello

bash$ type foo
foo is a function
foo () 
{ 
    echo hello
}

In zsh:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a shell function

Bash Solutions


Solution 1 - Bash

The zsh idiom is whence, the -f flag prints function definitions:

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

In zsh, type is defined as equivalent to whence -v, so you can continue to use type, but you'll need to use the -f argument:

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

And, finally, in zsh which is defined as equivalent to whence -c - print results in csh-like format, so which foo will yield the same results.

man zshbuiltins for all of this.

Solution 2 - Bash

I've always just used which for this.

Solution 3 - Bash

tl;dr

declare -f foo  # works in zsh and bash

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

If you don't mind or prefer including all command forms that exist for a given name in the output:Thanks, Raine Revere.

type -af  # zsh only (works differently in bash and ksh)

type -f / whence -f / which are suboptimal in this case, because their purpose is to report the command form with the highest precedence that happens to be defined by that name - as opposed to specifically reporting on the operand as a function.

That said, in practice this means that only an alias of the same name takes precedence (and technically also a shell keyword, though naming functions for shell keywords is probably a bad idea anyway).

Note that zsh does expand aliases in scripts by default (as does ksh, but not bash), and even if you turn alias expansion off first, type -f / whence -f / which still report aliases first.

In zsh, the -f option only includes shell functions in the lookup in zsh, so - unless -a is also used to list all command forms - an alias by the given name would print as the only output.

In bash and ksh, type -f actually excludes functions from the lookup; whence doesn't exist in bash, and in ksh it doesn't print the function definition; which is not a builtin in ksh and bash, and the external utility by definition cannot print shell functions.

Solution 4 - Bash

If you're not quite sure what you are looking for, you can type just

functions

and it will show you all the defined functions.

Note that there are sometimes a LOT of them, so you might want to pipe to a pager program:

functions | less

to undefine a function, use

unfunction functionname

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRob BednarkView Question on Stackoverflow
Solution 1 - Bashpb2qView Answer on Stackoverflow
Solution 2 - BashThorView Answer on Stackoverflow
Solution 3 - Bashmklement0View Answer on Stackoverflow
Solution 4 - BashDan PrittsView Answer on Stackoverflow