曲径通幽论坛

标题: config_load 与 uci_load [打印本页]

作者: beyes    时间: 2014-12-4 22:14
标题: config_load 与 uci_load
在编写配置脚本时,为了加载 UCI 配置文件,需要先包含下面的函数集文件:
  1. . /lib/functions.sh
复制代码

一般情况下,在编写 /etc/init.d/ 下的服务启停管理脚本时。第一行都会包含有 /etc/rc.common 文件,实际上在该文件中就已经包含了 /lib/functions.sh :
  1. . $IPKG_INSTROOT/lib/functions.sh
  2. . $IPKG_INSTROOT/lib/functions/service.sh
复制代码

其中 $IPKG_INSTROOT 变量一般为空,也就是 functions.sh 的绝对路径是 /lib/functions.sh 。


在你的脚本里包含了 functions.sh 后,就可以用其中的 config_load 函数来装载配置文件了,用法很简单:
  1. config_load network
复制代码

它后面跟着配置文件名 network,其相应的绝对路径为 /etc/config/network 。


config_load 函数的定义为:
[Bash shell] 纯文本查看 复制代码
config_load() {                        
        [ -n "$IPKG_INSTROOT" ] && return 0
        uci_load "$@"                     
}


在上面代码中,使用 uci_load 加载了命令行参数中的配置文件名,$@ 表示所有的命令行参数,注意它和 $* 的区分,我们可以遍历 $@ 中的每个参数。


在 /etc/functions.sh 的最后一行可以看到:
  1. [ -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 中的函数调用简析》。






欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2