Bash 可以打印函数定义:
$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
echo z
}
declare -fx y
然而,这在 POSIX Bash 下失败了,/bin/sh和/bin/破折号:
$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y
可以在 POSIX shell 下打印函数定义吗?
答案1
你不能便携地做到这一点。 POSIX 规范没有指定任何转储函数定义的方法,也没有指定函数的实现方式。
在 中bash
,您不必将函数导出到环境中,您可以使用:
declare -f funcname
(工作于zsh
)
即使您bash
在posix
模式下运行,这也有效:
$ bash --posix -c 'y(){ echo z; }; declare -f y'
y ()
{
echo z
}
在ksh
:
typeset -f funcname
(适用于bash
, zsh
, mksh
, pdksh
, lksh
)
在yash
:
typeset -fp funcname
yash
如果输入,这将不起作用POSIX 正确模式:
$ yash -o posixly-correct -c 'y() { ehco z; }; typeset -fp y'
yash: no such command `typeset'
和zsh
:
print -rl -- $functions[funcname]
whence -f funcname
type -f funcname
which funcname
请注意,whence -f
, which
,type -f
都会首先报告具有相同名称的别名。您可以使用-a
报告zsh
所有定义。
POSIXly,你必须自己记录你的函数定义,你可以这样做:
myfunction_code='myfunction() { echo Hello World; }'
eval "$myfunction_code"
或辅助函数
defn() {
code=$(cat)
eval "${1}_code=\$code; $1() { $code; }"
}
defn myfunction << 'EOF'
echo Hello World
EOF
printf '%s\n' "$myfunction_code"