Shell

POSIX列印函式定義

  • March 9, 2016

Bash 可以列印函式定義:

$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
   echo z
}
declare -fx y

然而,這在 POSIX Bash、/bin/sh和*/bin/dash*下失敗:

$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y

可以在 POSIX shell 下列印函式定義嗎?

你不能便攜地做到這一點。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如果進入POSIXly-correct 模式,這將不起作用:

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

引用自:https://unix.stackexchange.com/questions/268297