for i in /etc/rc.run/* ; do
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
export LC_ALL=C ==》定义全局变量
exec $i start ==》
fi
if LC_ALL=C egrep -q "(daemon |action |success |failure )" $i 2>/dev/null || [ "$subsys" = "single" -o "$subsys" = "local" ];
==》上面此句看不大明白
then
$i start 不明白
else
action "Starting $subsys: " $i start ==》不明白
fi
求解
-
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
Re: 求解
把 if 后的条件分解一下,它是用“||”连接的两条命令,只要有一条命令执行结果是真(返回0),则 if 条件为真。这两条命令是:if LC_ALL=C egrep -q "(daemon |action |success |failure )" $i 2>/dev/null || [ "$subsys" = "single" -o "$subsys" = "local" ];
==》上面此句看不大明白
LC_ALL=C egrep -q "(daemon |action |success |failure )" $i 2>/dev/null
[ "$subsys" = "single" -o "$subsys" = "local" ]
后者在 if 语句中很常见,不做过多解释,需要知道的就是“ [ ”其实就是 test 命令的一种表示方式,它也是一条命令,虽然常见于 if 语句中,但其实也是可以单独执行的。
第一条命令的命令句是 egrep,“LC_ALL=C”放到命令句的前面表示执行这条命令期间设置这个环境变量,“-q”参数让 egrep 命令不要输出信息,只返回状态(0表示找到了,非0表示没找到或出错),后面的“2> /dev/null”表示把 egrep 的标准错误输出(错误信息),改向到空设备,也就是丢弃。一般加了 -q,命令又没用错的话,egrep 不会有什么信息输出了,但为也防止万一有乱七八糟的信息出来干扰,加上 2> /dev/null 总是不错的主意。
所以整个条件就是,如果在 LC_ALL=C (相当于设置 locale)的环境下,egrep 在文件 $i 中找到那几个关键词之一,或者 $subsys 为 single 或 local,那么条件为真。
代码: 全选
action "Starting $subsys: " $i start ==》不明白