
Bashは関数定義を印刷できます。
$ bash -c 'y(){ echo z; }; export -f y; export -f'
y ()
{
echo z
}
declare -fx y
しかし、これはPOSIX Bashでは失敗します。/bin/shそして/ビン/ダッシュ:
$ bash --posix -c 'y(){ echo z; }; export -f y; export -f'
export -f y
POSIXシェルから関数定義を印刷できますか?
答え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"