在编写配置脚本时,为了加载 UCI 配置文件,需要先包含下面的函数集文件:
一般情况下,在编写 /etc/init.d/ 下的服务启停管理脚本时。第一行都会包含有 /etc/rc.common 文件,实际上在该文件中就已经包含了 /lib/functions.sh :
- . $IPKG_INSTROOT/lib/functions.sh
- . $IPKG_INSTROOT/lib/functions/service.sh
复制代码
其中 $IPKG_INSTROOT 变量一般为空,也就是 functions.sh 的绝对路径是 /lib/functions.sh 。
在你的脚本里包含了 functions.sh 后,就可以用其中的 config_load 函数来装载配置文件了,用法很简单:
它后面跟着配置文件名 network,其相应的绝对路径为 /etc/config/network 。
config_load 函数的定义为:
[Bash shell] 纯文本查看 复制代码 config_load() {
[ -n "$IPKG_INSTROOT" ] && return 0
uci_load "$@"
}
在上面代码中,使用 uci_load 加载了命令行参数中的配置文件名,$@ 表示所有的命令行参数,注意它和 $* 的区分,我们可以遍历 $@ 中的每个参数。
在 /etc/functions.sh 的最后一行可以看到:
- [ -z "$IPKG_INSTROOT" -a -f /lib/config/uci.sh ] && . /lib/config/uci.sh
复制代码
因此可知,uci_load 函数位于 /lib/config/uci.sh 中,且定义如下:
[Bash shell] 纯文本查看 复制代码 uci_load() {
local PACKAGE="$1"
local DATA
local RET
local VAR
_C=0
if [ -z "$CONFIG_APPEND" ]; then
for VAR in $CONFIG_LIST_STATE; do
export ${NO_EXPORT:+-n} CONFIG_${VAR}=
export ${NO_EXPORT:+-n} CONFIG_${VAR}_LENGTH=
done
export ${NO_EXPORT:+-n} CONFIG_LIST_STATE=
export ${NO_EXPORT:+-n} CONFIG_SECTIONS=
export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=0
export ${NO_EXPORT:+-n} CONFIG_SECTION=
fi
DATA="$(/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} ${LOAD_STATE:+-P /var/state} -S -n export "$PACKAGE" 2>/dev/null)"
RET="$?"
[ "$RET" != 0 -o -z "$DATA" ] || eval "$DATA"
unset DATA
${CONFIG_SECTION:+config_cb}
return "$RET"
}
该段代码的核心语句是 eval "$DATA",这个方法的巧妙之处请参考另一篇帖子《/lib/functions.sh 中的函数调用简析》。
|