为什么Bash脚本从rc.local启动无法获取返回值,手动运行却正常?
问题根因
- 环境变量PATH差异
rc.local是系统开机阶段运行的初始化服务,默认的PATH环境变量仅包含/bin、/usr/bin等基础路径,而你脚本中使用的iwgetid属于无线工具组件,通常存放在/usr/sbin或/sbin目录下,该路径不在rc.local的默认PATH范围内,导致iwgetid -r执行时报命令不存在,fssid变量取值为空。 - 空变量触发条件判断语法错误
network.sh中的条件判断if [ $fssid != $ssid ]没有给变量加双引号,当fssid为空时,该行会被解析为if [ != HAHAHAHAHAHA ],属于非法的Bash语法,函数直接报错终止,不会执行后续的echo true/echo false逻辑,最终你捕获到的返回值为空。 - (可选场景)如果确认路径配置正确,也可能是rc.local的执行时机早于无线网络初始化完成,此时无线网卡尚未完成SSID关联,
iwgetid自然无法返回有效值。
修复方案
- 所有外部命令使用绝对路径:先执行
which iwgetid查询工具的实际存放路径,例如返回/usr/sbin/iwgetid,就将network.sh中的对应行修改为fssid=$(/usr/sbin/iwgetid -r) - 所有条件判断的变量增加双引号包裹,避免空值语法问题:将判断行修改为
if [ "$fssid" != "$ssid" ] - 若为开机执行时机问题,可在rc.local调用脚本前增加延迟,等待网络初始化完成:将rc.local中的调用行修改为
/bin/sleep 10 && /bin/bash /toto.sh
额外语法问题提示
你提供的toto.sh中存在语法错误:if [ $IPWAN != $IP ]后先写了echo日志语句才声明then,不符合Bash的if语法规则,会导致后续IP变更判断逻辑执行异常,建议调整为正确格式:
if [ $IPWAN != $IP ] then echo "$(date '+%Y-%m-%d %H:%M:%S') : IPWAN has changed" >> $LOGFILE export EXTERNALIP=$IP # update du dns update_dns echo "$(date '+%Y-%m-%d %H:%M:%S') : New IPWAN is $IP" >> $LOGFILE break else break fi
内容的提问来源于stack exchange,提问作者Goa_From_Gaia
相关产品推荐
相关产品推荐

