我的正确方法后我看到如果一个函数的定义或没有。 一个POSIX兼容的方式。
__function_defined() {
FUNC_NAME=$1
d=$(declare -f $FUNCNAME)
if [ "${DISTRO_NAME_L}" = "centos" ]; then
if typeset -f $FUNC_NAME &>/dev/null ; then
echo " * INFO: Found function $FUNC_NAME"
return 0
fi
# Try POSIXLY_CORRECT or not
elif test -n "${POSIXLY_CORRECT+yes}"; then
if typeset -f ${FUNC_NAME} >/dev/null 2>&1 ; then
echo " * INFO: Found function $FUNC_NAME"
return 0
fi
else
# Arch linux seems to fall here
if $( type ${FUNC_NAME} >/dev/null 2>&1 ) ; then
echo " * INFO: Found function $FUNC_NAME"
return 0
fi
echo " * INFO: $FUNC_NAME not found...."
return 1
}
以上所有都按照Debian的考虑bash'isms checkbashisms脚本。
试图到grep脚本也并不确定。 例如:
if [ "$(grep $FUNC_NAME $(dirname $0)/$(basename $0))x" != "x" ]; then
# This is really ugly and counter producing but it was, so far, the
# only way we could have a POSIX compliant method to find if a function
# is defined within this script.
echo " * INFO: Found function $FUNC_NAME"
return 0
fi
不会起作用,因为该脚本也应该喜欢的工作:
wget --no-check-certificate -O - http://URL_TO_SCRIPT | sudo sh
那么,什么是正确的,符合POSIX标准的方式来做到这一点?
平原SH请,没有庆典,没有KSH,没有其他的壳,只是普通的SH。 哦,没有实际尝试运行的功能太:)
可能吗?
我已经找到了POSIX兼容的解决方案:
if [ "$(command -v $FUNC_NAME)x" != "x" ]; then
echo " * INFO: Found function $FUNC_NAME"
return 0
fi
现在的问题, 有没有更好的解决办法 ?