POSIX 打印函数定义

POSIX 打印函数定义

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

即使您bashposix模式下运行,这也有效:

$ 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"

答案2

不,至少据我所知不是。

-f是一个扩展POSIX 导出

POSIX set(以及bash set在 POSIX 模式下)还排除函数定义。

相关内容