曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6223|回复: 0
打印 上一主题 下一主题

[系统应用] config_load 与 uci_load

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2014-12-4 22:14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在编写配置脚本时,为了加载 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 中的函数调用简析》。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 13:12 , Processed in 0.066037 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表