POSIX 打印函数定义

Ste*_*nny 5 shell posix function

Bash 可以打印函数定义:

$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
    echo z
}
declare -fx y
Run Code Online (Sandbox Code Playgroud)

然而,这在 POSIX Bash、/bin/sh/bin/dash下失败:

$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y
Run Code Online (Sandbox Code Playgroud)

可以在 POSIX shell 下打印函数定义吗?

cuo*_*glm 6

你不能便携地做到这一点。POSIX 规范没有指定任何转储函数定义的方法,也没有指定函数的实现方式。


在 中bash,您不必将函数导出到环境中,您可以使用:

declare -f funcname
Run Code Online (Sandbox Code Playgroud)

(工作于zsh

bash即使您在模式下运行,这也有效posix

$ bash --posix -c 'y(){ echo z; }; declare -f y'
y () 
{ 
    echo z
}
Run Code Online (Sandbox Code Playgroud)

ksh

typeset -f funcname
Run Code Online (Sandbox Code Playgroud)

(适用于bash, zsh, mksh, pdksh, lksh


yash

typeset -fp funcname
Run Code Online (Sandbox Code Playgroud)

yash如果进入POSIXly 正确模式,这将不起作用:

$ yash -o posixly-correct -c 'y() { ehco z; }; typeset -fp y'
yash: no such command `typeset'
Run Code Online (Sandbox Code Playgroud)

zsh

print -rl -- $functions[funcname]
whence -f funcname
type -f funcname
which funcname
Run Code Online (Sandbox Code Playgroud)

请注意whence -f, , which,type -f都会首先报告具有相同名称的别名。您可以使用-a报告zsh所有定义。


POSIXly,你必须自己记录你的函数定义,你可以这样做:

myfunction_code='myfunction() { echo Hello World; }'
eval "$myfunction_code"
Run Code Online (Sandbox Code Playgroud)

或辅助函数

defn() {
  code=$(cat)
  eval "${1}_code=\$code; $1() { $code; }"
}

defn myfunction << 'EOF'
echo Hello World
EOF

printf '%s\n' "$myfunction_code"
Run Code Online (Sandbox Code Playgroud)

  • @schily 最近为此打开了 http://austingroupbugs.net/view.php?id=1025 。 (3认同)