You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:30:48