Shell
POSIX列印函式定義
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
)即使您
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
如果進入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"