Скорость тестирования различных решений
#!/bin/bash
f () {
echo 'This is a test function.'
echo 'This has more than one command.'
return 0
}
test_declare () {
declare -f f > /dev/null
}
test_declare2 () {
declare -F f > /dev/null
}
test_type () {
type -t f | grep -q 'function'
}
test_type2 () {
local var=$(type -t f)
[[ "${var-}" = function ]]
}
post=
for j in 1 2; do
echo
echo 'declare -f' $post
time for i in $(seq 1 1000); do test_declare; done
echo
echo 'declare -F' $post
time for i in $(seq 1 1000); do test_declare2; done
echo
echo 'type with grep' $post
time for i in $(seq 1 1000); do test_type; done
echo
echo 'type with var' $post
time for i in $(seq 1 1000); do test_type2; done
unset -f f
post='(f unset)'
done
выходы, например ::1004 *
объявить -f
реальное 0m0,037 с
пользователь 0m0.024s
sys 0m0,012s
объявить -F
реальный 0m0.030s
пользователь 0m0.020s
sys 0m0.008s
тип с grep
реальный 0m1,772s
пользователь 0m0.084s
sys 0m0,340s
тип с VAR
реальный 0m0,770s
пользователь 0m0.096s
sys 0m0,160s
объявить -f (f не установлено)
реальное 0m0,031 с
пользователь 0m0.028s
sys 0m0.000s
объявить -F (f не установлено)
реальный 0m0,031s
пользователь 0m0.020s
sys 0m0.008s
тип с grep (f не установлен)
реальный 0m1.859s
пользователь 0m0.100s
sys 0m0,348s
тип с переменной var (f unset)
реальный 0m0.683s
пользователь 0m0.092s
sys 0m0,160s
Так что declare -F f && echo function f exists. || echo function f does not exist.
кажется лучшим решением.