测试不同的解决方案:
#!/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 未设置)
真正的 0m0,040s 用户 0m0,029s 系统 0m0,010s 退出代码 1
test_declare2 (f 未设置)
真正的 0m0,038s 用户 0m0,038s 系统 0m0,000s 退出代码 1
test_type (f 未设置)
真正的 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
似乎是最好的解决方案。