2015-11-04 107 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 
}