我创建了一个带有相应 shell 脚本的 udev 规则,以设置我的 USB 键盘连接到 Raspberry Pi 时的键盘重复率。
脚本包含此行
xset r rate 250 50
还有一些其他行将调试文本打印到文件中,我已使用该文件来确保脚本由 udev 运行。(换句话说,我已经验证了脚本可以运行,但它确实不是设置键盘重复率 - 就好像上面引用的 shell 脚本行不在文件中一样。)
我不明白为什么这xset
条线没有效果。
我在调试输出文件中观察到一些奇怪的行为。似乎 udev 运行了脚本两次当键盘连接时。
以下是 udev 规则文件的内容
# cat /etc/udev/rules.d/00-keyboard.rules
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="<whatever>", ATTRS{idProduct}=="<whatever>", RUN+="/home/pi/udev/script.sh"
我的想法是也许正在运行其他东西(也许是其他脚本?)后udev 脚本已运行,并且这将取消xset
脚本中包含的命令。
插入键盘/鼠标设备后可能会加载哪些其他脚本/配置文件?
编辑:xset
从终端运行命令按预期工作
答案1
所以,在网上搜索了一年之后,今天我终于让它工作了。
来源:https://newbedev.com/udev-rule-to-auto-load-keyboard-layout-when-usb-keyboard-plugged-in
正如@TomYan 已经提到的,xset
这是一个 X11 程序。因此您必须对DISPLAY
和XAUTHORITY
环境变量进行硬编码。
基本上,解决方法是在后台运行脚本并稍作延迟。这样 udev 就可以在您 xset 键盘之前激活键盘。在上述解决方案中,udev 调用一个脚本,该脚本又在后台调用第二个脚本,然后调用xset
。实际上,这可以缩短为一个脚本。
/home/pi/udev/script.sh
#!/usr/bin/env bash
(
sleep 1
DISPLAY=":0.0"
XAUTHORITY="/home/codekandis/.Xauthority"
export DISPLAY XAUTHORITY
xset r rate 250 50
) &