POSIX 印刷機能の定義

POSIX 印刷機能の定義

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、、、、)zshmkshpdkshlksh


存在する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使用できます。-azsh


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"

おすすめ記事