さまざまなソリューションのテスト:
#!/bin/bash
test_declare () {
declare -f f > /dev/null
}
test_declare2 () {
declare -F f > /dev/null
}
test_type () {
type -t f | grep -q 'function'
}
test_type2 () {
[[ $(type -t f) = function ]]
}
funcs=(test_declare test_declare2 test_type test_type2)
test () {
for i in $(seq 1 1000); do $1; done
}
f () {
echo 'This is a test function.'
echo 'This has more than one command.'
return 0
}
post='(f is function)'
for j in 1 2 3; do
for func in ${funcs[@]}; do
echo $func $post
time test $func
echo exit code $?; echo
done
case $j in
1) unset -f f
post='(f unset)'
;;
2) f='string'
post='(f is string)'
;;
esac
done
出力例:
test_declare (f は関数)
実際の 0m0,055s ユーザー 0m0,041s システム 0m0,004s 終了コード 0
test_declare2 (f は関数)
実際の 0m0,042s ユーザー 0m0,022s システム 0m0,017s 終了コード 0
test_type (f は関数)
実際の 0m2,200s ユーザー 0m1,619s システム 0m1,008s 終了コード 0
test_type2 (f は関数)
実際の 0m0,746s ユーザー 0m0,534s システム 0m0,237s 終了コード 0
test_declare (f unset)
実際の 0m0,040s ユーザー 0m0,029s システム 0m0,010s 終了コード 1
test_declare2 (f unset)
実際の 0m0,038s ユーザー 0m0,038s システム 0m0,000s 終了コード 1
test_type (f unset)
実際の 0m2,438s ユーザー 0m1,678s システム 0m1,045s 終了コード 1
test_type2 (f 未設定)
実際の 0m0,805s ユーザー 0m0,541s システム 0m0,274s 終了コード 1
test_declare (f は文字列)
実際の 0m0,043s ユーザー 0m0,034s システム 0m0,007s 終了コード 1
test_declare2 (f は文字列)
実際の 0m0,039s ユーザー 0m0,035s システム 0m0,003s 終了コード 1
test_type (f は文字列)
実際の 0m2,394s ユーザー 0m1,679s システム 0m1,035s 終了コード 1
test_type2 (f は文字列)
実際の 0m0,851s ユーザー 0m0,554s システム 0m0,294s 終了コード 1
したがってdeclare -F f
、最適なソリューションのようです。