Linux和bash - 如何获取输入设备事件的设备名称?

时间:2015-11-04 09:20:38

标签: linux bash

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

手动,我运行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,因为它无法终止。

1 个答案:

答案 0 :(得分: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
}