一、基础函数
1. boot_hook_init
boot_hook_init(){
local hook="${1}_hook"
export -n"PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$hook" #加入到PI_STACK_LIST,以空格分隔
export -n "$hook=" #保存到环境变量中,以参数_hook命名
}
2. boot_hook_add
boot_hook_add(){
localhook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
local func="${2}"
[ -n "$func" ] && {
local v; eval "v=\$$hook"
export -n "$hook=${v:+$v}$func" #以参数1作为变量名,将参数2作为值存储,以空格分割
}
}
3. boot_hook_shift
boot_hook_shift(){
local hook="${1}_hook"
local rvar="${2}"
local v; eval"v=\$$hook"
[ -n "$v" ] && {
local first="${v%%*}" #取出第一个变量
[ "$v" != "${v#*}" ] && \
export -n"$hook=${v#* }" || \ #去除第一个值,将剩余的值作为变量的值,值是用空格分割的
export -n"$hook=" #如果取完值,将变量设置为空
export -n"$rvar=$first" #将值赋值给func
return 0
}
return 1
}
逐个取变量值
4. boot_run_hook
boot_run_hook(){
local hook="$1"
local func
while boot_hook_shift "$hook"func; do #逐个去变量值
local ran; eval"ran=\$PI_RAN_$func"
[ -n "$ran" ] || {
export -n"PI_RAN_$func=1" #设置为1,标识该变量
$func "$1""$2" #运行对应变量所对应的宏
}
done
}
二、例子
openwrt初始化了如下变量
boot_hook_init preinit_essential
boot_hook_init preinit_main
boot_hook_init failsafe
boot_hook_init initramfs
boot_hook_init preinit_mount_root
比如preinit_main变量
l 执行boot_hook_init
环境中会存在
preinit_main_hook= #该变量未赋值
PI_STACK_LIST=preinit_main_hook
在执行完上面几个初始化后
PI_STACK_LIST= preinit_essential preinit_main failsafe initramfspreinit_mount_root
l 执行boot_hook_add
preinit_main_hook=define_default_set_state preinit_ip pi_indicate_preinitpreinit_ip pi_indicate_preinit do_sysinfo_generic failsafe_waitrun_failsafe_hook indicate_regular_preinit initramfs_test do_mount_rootrun_init
l 执行boot_hook_run
在该步骤中,他会逐个取出preinit_main_hook的值,然后调用它
三、用途
归类,类似于如初始化阶段,要做哪些动作,然后到另一个阶段,又要做哪一些动作,而这些阶段,这里由这些定义
boot_hook_init preinit_essential
boot_hook_init preinit_main
boot_hook_init failsafe
boot_hook_init initramfs
boot_hook_init preinit_mount_root