求助:Linux下playerctl脚本输出异常问题排查
问题分析与解决
你的脚本出现该问题有两个核心原因:
- 前两次调用
playerctl status时未重定向错误输出,当无播放器运行时,playerctl会直接向终端的stderr打印No players found——这不是脚本里echo的输出,而是程序本身的错误信息。 - 第三个判断逻辑错误:
playerctl status 2>/dev/null会丢弃错误输出,此时程序的stdout为空字符串,拿空值和No players found比较永远不成立,导致走到else分支。
修复后的脚本
#!/bin/bash # 一次性获取playerctl的状态,合并stderr到stdout以便捕获错误信息 player_status=$(playerctl status 2>&1) if [ "$player_status" = "Playing" ]; then echo " play " elif [ "$player_status" = "Paused" ]; then echo " pause " elif [ "$player_status" = "No players found" ]; then echo " not found " else echo "other" fi
关键优化点
- 合并错误输出:用
2>&1把playerctl的stderr输出合并到stdout,无播放器时的错误提示会被捕获到变量中,而非直接打印到终端。 - 减少重复调用:只执行一次
playerctl status,避免多次调用可能带来的状态不一致问题,同时提升脚本效率。 - 规范字符串比较:使用bash标准的
=进行字符串比较,并用双引号包裹变量,防止空值或含空格的字符串导致判断逻辑异常。 - 移除冗余操作:原脚本里
echo -n $(playerctl status)属于冗余操作,$(...)本身会自动去除输出末尾的换行符,无需额外处理。
内容的提问来源于stack exchange,提问作者Devalla Bharath
相关产品推荐
相关产品推荐

