编写Bash脚本监听游戏手柄插入并获取ID_MODEL执行命令
解决Raspbian Buster下监听游戏手柄插拔并执行命令的方案
核心思路
利用系统自带的udev机制实时监听设备插拔事件,通过匹配游戏手柄专属的udev属性过滤掉硬盘等外设,触发脚本提取ID_MODEL并执行指定命令。udev会自动持续响应新的插拔事件,无需脚本自身循环。
步骤实现
1. 确认游戏手柄的udev属性
先插上手柄,执行以下命令查看其关键udev标识,确保能准确区分手柄与其他外设:
udevadm info -a /dev/input/js0 | grep -E 'SUBSYSTEM|ID_INPUT_JOYSTICK|ID_MODEL'
你会看到类似输出:
SUBSYSTEM=="input"
ID_INPUT_JOYSTICK="1"
ID_MODEL="Xbox_Wireless_Controller"
其中ID_INPUT_JOYSTICK="1"是游戏手柄的专属标识,硬盘等外设属于block子系统,不会匹配该规则。
2. 创建udev规则文件
在/etc/udev/rules.d/目录下新建规则文件(文件名以数字开头,确保优先级):
sudo nano /etc/udev/rules.d/99-gamepad.rules
写入以下规则:
# 监听游戏手柄插入事件,触发处理脚本 SUBSYSTEM=="input", ENV{ID_INPUT_JOYSTICK}=="1", ACTION=="add", RUN+="/usr/local/bin/handle_gamepad.sh"
SUBSYSTEM=="input":限定只处理input类设备ENV{ID_INPUT_JOYSTICK}=="1":仅匹配游戏手柄ACTION=="add":只响应设备插入事件RUN+="...":指定触发的脚本绝对路径
3. 编写处理脚本
创建脚本文件并赋予执行权限:
sudo nano /usr/local/bin/handle_gamepad.sh sudo chmod +x /usr/local/bin/handle_gamepad.sh
脚本内容如下(替换为你的实际命令):
#!/bin/bash # 从udev传递的环境变量中提取手柄型号 GAMEPAD_MODEL="$ID_MODEL" # 示例:将事件写入日志(可替换为你的目标命令) echo "$(date): 检测到新手柄 - $GAMEPAD_MODEL" >> /var/log/gamepad_events.log # 执行你的指定命令,比如启动游戏或配置工具 # /path/to/your/command "$GAMEPAD_MODEL"
注意:udev运行脚本时环境变量有限,所有路径尽量用绝对路径,避免依赖用户环境变量。
4. 加载规则并测试
重新加载udev规则使其生效:
sudo udevadm control --reload-rules && sudo udevadm trigger
现在插拔游戏手柄,脚本会自动触发,可通过日志验证:
cat /var/log/gamepad_events.log
额外提示
- 若需处理手柄拔出事件,可在udev规则中添加
ACTION=="remove"的条目,对应编写处理逻辑 - 用
udevadm monitor --environment命令可实时查看udev事件,便于调试规则 - 如果脚本需要与桌面环境交互(如弹出通知),需额外设置环境变量,可在脚本中添加:
export DISPLAY=:0 export XAUTHORITY=/home/pi/.Xauthority
内容的提问来源于stack exchange,提问作者Isabelle
相关产品推荐
相关产品推荐

