Bash - 如何在连接USB设备时运行代码

时间:2017-04-06 20:28:42

标签: python linux bash keyboard usb

我正在编写一个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脚本也可以。

2 个答案:

答案 0 :(得分:2)

感谢here我能够提出以下解决方案。 它有以下改进:

  • 它不依赖于特定的键盘,它将以相同的方式处理所有USB键盘。
  • 如果用户手动切换到不同的键盘布局(既不是默认键盘也不是USB键盘),则不会自动将其切换回默认布局或USB布局。

请随时在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我会使用idVendoridProduct您可以通过附加键盘并使用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