我正在编写一个bash脚本来自动检测我的USB键盘何时插入笔记本电脑(运行Ubuntu 14),这样我就可以自动更改键盘布局了。
到目前为止,这是我的代码(我从Stack Overflow上的另一篇文章中得到它,所以我不能100%确定它是如何工作的)
#!/bin/bash
setxkbmap es
for dev in /sys/bus/usb/devices/ *-*:*
do
if [ -f $dev/bInterfaceClass ]
then
if [[ "$(cat $dev/bInterfaceClass)" == "03" && "$(cat $dev/bInterfaceProtocol)" == "01" ]]
then
setxkbmap gb
fi
fi
done
到目前为止,我已经让它在启动时运行了...但我希望每次连接或断开USB设备时都会运行它。
重要的是,我将它全部运行在一个Bash脚本中,而不是作为... udev / ...中的.rules文件或其他任何内容。但是,单个Python脚本也可以。
答案 0 :(得分:2)
感谢here我能够提出以下解决方案。 它有以下改进:
请随时在ralf htp
改进此代码grep -Po '^ABC.*\bexample\b(?=[^[:alpha:]]*$)'
答案 1 :(得分:1)
这是有效的,因为在linux系统上文件系统结构总是相同的
cat $dev/bInterfaceClass
向每个USB设备查询其接口类
cat $dev/bInterfaceProtocol
向每个USB设备查询其接口协议
尝试ls /sys/bus/usb/devices/
,您会看到所有USB设备节点
然后选择一个ls /sys/bus/usb/devices/usb1
并使用ls /sys/bus/usb/devices/usb1/idVendor
而不是bInterfaceProtocol
我会使用idVendor
和idProduct
您可以通过附加键盘并使用lsusb
并从中选择来确定键盘的产品ID和供应商ID上市
更新
以下脚本将执行此操作。插入设备的供应商和产品ID。也许在没有setxkbmap
命令的情况下进行测试。 flag
变量用于不每5秒设置一次键盘地图......
#!/bin/bash
flag=0
while true
do
for dev in /sys/bus/usb/devices/*-*
do
if [ -f $dev/idVendor ]
then
if [[ "$(cat $dev/idVendor)" == "your_vendor_id" && "$(cat $dev/idProduct)" == "your_product_id" ]]
then
if [[ "$flag" == "0" ]]
then
echo 'USB device attached'
setxkbmap gb
fi
flag=1
break
fi
if [[ "$flag" == "1" ]]
then
echo 'USB device detached'
setxkbmap es
fi
flag=0
fi
done
sleep 5s
done
请注意,要setxkbmap
工作,您必须安装x11-xkb-utils
(https://superuser.com/questions/404457/how-to-change-keyboard-layout-while-in-console)