【问题标题】:Linux and bash - How can I get the device name of an input device event?Linux 和 bash - 如何获取输入设备事件的设备名称?
【发布时间】:2015-11-04 09:20:38
【问题描述】:

我正在尝试自动化获取游戏控制器的设备事件并检查其名称的过程,然后如果名称与字符串匹配,则将事件传递给另一个程序。

我手动运行evtest /dev/input/eventXX 来检查输入设备的名称,然后通过键盘中断(ctrl-c) 来停止它。如果该设备与某种类型的游戏控制器的名称匹配,我会使用相同的事件编号运行命令xboxdrv --evtest /dev/input/eventXX

但是,因为“evtest”命令会继续打印输入设备的输出,而不是在打印名称后终止并且仅在键盘中断时退出,所以我不确定如何让 bash 脚本获取设备的名称.

我还在学习 bash,所以我的代码中可能存在语法错误。但是,这里是:

#!/bin/sh
WiiUGCName="Wii U Gamecube Adapter Port"

#find the controller(s)
NumberOfEvents=$(ls /dev/input | grep -c event*)

echo "Number of input devices: $NumberOfEvents"

#launch xboxdrv for each controller
i=0
while [ $i < $NumberOfEvents ]; do
    echo "loop"
    OccurrencesOfName=$(evtest /dev/input/event$i | grep -c "$WiiUGCName")
    echo "Occurrences: $OccurrencesOfName"
    if [ $OccurrencesOfName>0 ]; then
        echo "Controller found"
        #launch xboxdrv here
    else
        echo "no controller found"
    fi
    let i=i+1
done

所有这些代码现在实际上都挂在evtest,因为它不能被终止。

【问题讨论】:

    标签: linux bash


    【解决方案1】:

    最简单的选择是给evtest 一些合理的时间来打印输出中有趣的部分,比如1 秒,然后将其终止。如果将该代码放在 shell 函数中,则生成的代码可以保持可读性。例如,替换:

    OccurrencesOfName=$(evtest /dev/input/event$i | grep -c "$WiiUGCName")
    

    调用 shell 函数:

    OccurrencesOfName=$(evtest_and_exit | grep -c "$WiiUGCName")
    

    evtest_and_exit可以定义如下:

    evtest_and_exit() {
        local evtest_pid
        evtest /dev/input/event$i &
        evtest_pid=$!
        sleep 1  # give evtest time to produce output
        kill $evtest_pid
    }
    

    【讨论】:

    • 如果不使用 evtest,就没有干净的方法可以做到这一点,例如阅读 /proc/ 中的一些内容? evtest 如何继续获取设备的名称?
    • @tobiasBora 你应该把它作为一个单独的问题发布。
    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多