2015-11-04 140 views
2

我试图自动化获取游戏控制器的设备事件并检查其名称的过程,然后如果名称匹配字符串,则将事件传递给另一个程序。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

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

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

具有壳功能的调用:

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 
}