对于Bash shell脚本,我是一个业余爱好者,在CentOS 5.10系统的/etc/init.d/functions中killproc()函数的第一行令我感到困惑:
local RC killlevel= base pid pid_file= delay try
这条线的含义是什么? 我相信这也许是局部variables的声明,但是在几个项目之后,它的含义是什么? 我已经包括完整的killproc()函数供参考:
# A function to stop a program. killproc() { local RC killlevel= base pid pid_file= delay try RC=0; delay=3; try=0 # Test syntax. if [ "$#" -eq 0 ]; then echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]" return 1 fi if [ "$1" = "-p" ]; then pid_file=$2 shift 2 fi if [ "$1" = "-d" ]; then delay=$(echo $2 | awk -v RS=' ' -v IGNORECASE=1 '{if($1!~/^[0-9.]+[smhd]?$/) exit 1;d=$1~/s$|^[0-9.]*$/?1:$1~/m$/?60:$1~/h$/?60*60:$1~/d$/?24*60*60:-1;if(d==-1) exit 1;delay+=d*$1} END {printf("%d",delay+0.5)}') if [ "$?" -eq 1 ]; then echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]" return 1 fi shift 2 fi # check for second arg to be kill level [ -n "${2:-}" ] && killlevel=$2 # Save basename. base=${1##*/} # Find pid. __pids_var_run "$1" "$pid_file" if [ -z "$pid_file" -a -z "$pid" ]; then pid="$(__pids_pidof "$1")" fi # Kill it. if [ -n "$pid" ] ; then [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base " if [ -z "$killlevel" ] ; then if checkpid $pid 2>&1; then # TERM first, then KILL if not dead kill -TERM $pid >/dev/null 2>&1 usleep 100000 if checkpid $pid ; then try=0 while [ $try -lt $delay ] ; do checkpid $pid || break sleep 1 let try+=1 done if checkpid $pid ; then kill -KILL $pid >/dev/null 2>&1 usleep 100000 fi fi fi checkpid $pid RC=$? [ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown" RC=$((! $RC)) # use specified level only else if checkpid $pid; then kill $killlevel $pid >/dev/null 2>&1 RC=$? [ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel" elif [ -n "${LSB:-}" ]; then RC=7 # Program is not running fi fi else if [ -n "${LSB:-}" -a -n "$killlevel" ]; then RC=7 # Program is not running else failure $"$base shutdown" RC=0 fi fi # Remove pid file if any. if [ -z "$killlevel" ]; then rm -f "${pid_file:-/var/run/$base.pid}" fi return $RC }
它只是声明了很多函数范围变量,其中killlevel
和pid_file
被分配了空字符串,其他的没有被分配任何东西。
有一点点区别。 local
变量在函数调用的函数中也是可见的。 所以,如果你碰巧调用killproc()
,未初始化的将从调用者记住。
在Debian上, lib/lsb/init-functions
文件如下所示:
killproc() { local pidfile sig status base name_param is_term_sig OPTIND pidfile= name_param= is_term_sig=