Radiotray-NG状态Bash脚本多状态返回与优雅退出问题
解决RadioTray-NG脚本无法干净退出的问题
问题分析
当前脚本在RadioTray-NG未运行时,执行启动命令会导致脚本挂起——因为radiotray-ng --play默认以前台模式运行,会占用终端直到程序退出;同时调用rtng-dbus时会输出DBus错误信息,干扰状态判断的整洁性。
修复后的脚本
#!/bin/bash app="radiotray-ng" launchrt="/usr/bin/radiotray-ng --play" playrt="$HOME/.config/radiotray-ng/rtng-dbus play" # 仅调用一次状态查询,重定向错误输出避免干扰 rt_state_output=$("$HOME/.config/radiotray-ng/rtng-dbus" get_player_state 2>/dev/null) rtstate=$(echo "$rt_state_output" | grep state) # 直接通过字符串匹配判断状态 if echo "$rt_state_output" | grep -q "state: playing"; then echo "RadioTray Is Playing" elif echo "$rt_state_output" | grep -q "state: running"; then echo "RadioTray Is Running. Starting Player" $playrt else # 未运行状态下后台启动程序,并重定向所有输出 echo "RadioTray Is Not Running. Launching Player" $launchrt >/dev/null 2>&1 & fi exit 0
关键改动说明
- 后台启动程序:在
$launchrt后添加>/dev/null 2>&1 &,将RadioTray-NG放到后台运行,同时把标准输出和错误输出都重定向到/dev/null,避免脚本被前台阻塞,实现立即退出。 - 屏蔽DBus错误:调用
rtng-dbus时添加2>/dev/null,直接丢弃服务未启动时的DBus报错信息,让状态判断更干净。 - 优化状态查询:仅执行一次
rtng-dbus get_player_state并保存结果,避免重复调用工具,提升脚本效率。 - 简化判断逻辑:用
grep -q直接匹配输出内容,无需额外定义多个状态变量,逻辑更清晰。
验证效果
- 播放中:输出
RadioTray Is Playing,脚本立即退出 - 运行未播放:输出
RadioTray Is Running. Starting Player,触发播放后脚本立即退出 - 未运行:输出
RadioTray Is Not Running. Launching Player,后台启动RadioTray-NG并播放,脚本立即退出,无多余错误输出
内容的提问来源于stack exchange,提问作者user18003991
相关产品推荐
相关产品推荐

