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

标签 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 脚本也可以。

最佳答案

感谢ralf htp我能够想出以下解决方案。 它有以下改进:

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

请随时改进此代码 GitHub Gist

#!/bin/bash
kbd1=es #default keyboard layout
kbd2=gb #USB keyboard layout

flag=0
while true
do
    layout="$(setxkbmap -query | grep -a layout | cut -c13-14)"
    if [[ $layout == $kbd1 ]] || [[ $layout == $kbd2 ]]
    then
        for dev in /sys/bus/usb/devices*-*
        do
            if [ -f $dev/bInterfaceClass ]
            then
                if [[ "$(cat $dev/bInterfaceClass)" == "03" && "$(cat 
$dev/bInterfaceProtocol)" == "01" ]]
                then
                    if [[ "$flag" == "0" ]]
                    then
                            setxkbmap $kbd2
                    fi
                    flag=1
                    break
                fi 
                if [[ "$flag" == "1" ]]
                then
                    setxkbmap $kbd1
                fi
                flag=0
            fi
        done
    fi
    sleep 5s
done

关于python - Bash - 如何在连接 USB 设备时运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43265185/

相关文章:

python - 使用 matplotlib 绘制地震摆动轨迹

python - Python 中的 A/B 拆分测试有哪些资源?

linux - 如何让 R 使用所有处理器?

linux - 通过 SSH 在远程主机上运行功能

bash - 列出所有以 string 开头的 git 本地分支

bash - 如何从 bash shell 使用 GitLab 函数 "Create Merge Request"?

python - 如何基于model_a的某个字段暴露model_b的一些特定字段?

python - Cython 类型的内存 View : what they really are?

linux - BZIP2 压缩文件滞后

arrays - Bash - 通过每个镜像处理元统计数据