You can not do it portably. POSIX spec did not specify any way to dump function definition, nor how functions are implemented.
In bash
, you don't have to export the function to the environment, you can use:
declare -f funcname
(Work in zsh
)
This works even you run bash
in posix
mode:
$ bash --posix -c 'y(){ echo z; }; declare -f y'
y ()
{
echo z
}
In ksh
:
typeset -f funcname
(Works in bash
, zsh
, mksh
, pdksh
, lksh
)
In yash
:
typeset -fp funcname
This won't work if yash
enter POSIXly-correct mode:
$ yash -o posixly-correct -c 'y() { ehco z; }; typeset -fp y'
yash: no such command `typeset'
With zsh
:
print -rl -- $functions[funcname]
whence -f funcname
type -f funcname
which funcname
Note that both whence -f
, which
, type -f
will report alias first with the same name. You can use -a
to make zsh
report all definitions.
POSIXly, you'd have to record your function definition yourself which you could do with:
myfunction_code='myfunction() { echo Hello World; }'
eval "$myfunction_code"
or a helper function
defn() {
code=$(cat)
eval "${1}_code=\$code; $1() { $code; }"
}
defn myfunction << 'EOF'
echo Hello World
EOF
printf '%s\n' "$myfunction_code"