web-dev-qa-db-ja.com

入力デバイスイベントでシェルスクリプトを実行するにはどうすればよいですか?

キーボードとして表示されるUSBリモートプレゼンターがあります。

evtestを使用すると、デバイスからの入力イベントを確認できます。

これらのイベントをシェルスクリプトでキャプチャするにはどうすればよいですか?

Cを使用したいくつかの解決策を見たことがありますが、可能であればbashのみを使用したものをお勧めします。

すでにxbindkeysで何かを試しましたが、キーボードイベントもキャプチャされたので、それは望ましくありません。

udev rulesについても読んだことがありますが、これらのルールはプラグイベントとアンプラグイベントにのみ役立つようです。

1
paulequilibrio

@paulequilibrioあなたの投稿に感謝します私はあなたのスクリプトを変更して、次にmi IRリモートを取得し、Ubuntu 18.04でlircなしでRhythmboxで動作する前ボタンと停止ボタンを追加しました、これは自動実行に追加されました...

device='/dev/input/by-id/usb-Formosa21_Beanbag_Emulation_Device_000052F1-event-if00'

#key_playpause='*type 1 (EV_KEY), code 164 (KEY_PLAYPAUSE), value 1*'
key_stop='*type 1 (EV_KEY), code 128 (KEY_STOP), value 1*'
key_next='*type 1 (EV_KEY), code 407 (KEY_NEXT), value 1*'
key_previous='*type 1 (EV_KEY), code 412 (KEY_PREVIOUS), value 1*'

Sudo evtest "$device" | while read line; do
    case $line in
#       ($key_playpause)    notify-send "Play/Pause" && rhythmbox-client --playpause ;;
        ($key_stop)     notify-send "Stop" && rhythmbox-client --stop ;;
        ($key_next)     notify-send "Next" && rhythmbox-client --next ;;
        ($key_previous)     notify-send "Previous" && rhythmbox-client --previous ;;
    esac
done
3
Jorge Velez

この例は、タッチパッドのタップを監視しています。

xinput test-xi2 --root "AlpsPS/2 ALPS DualPoint TouchPad" \
| grep --line-buffered "EVENT type 15 (RawButtonPress)"| while read line; do
    paplay --volume 22000 -d $Pulse_SINK $HOME/scripts/data/click.aiff
done

必要に応じて簡単に変更できます。

2
Ipor Sircer

@JeffSchaller、編集していただきありがとうございます。

@IporSircerの回答(ありがとう!)に基づいて、次のスクリプトを作成することができました。

#!/bin/bash

device='/dev/input/by-id/usb-Targus_Laser_Presentation_Remote-if02-event-kbd'
event_blank='*code 48 (KEY_B), value 1*'
event_esc='*code 1 (KEY_ESC), value 1*'
event_f5='*code 63 (KEY_F5), value 1*'
event_prev='*code 104 (KEY_PAGEUP), value 1*'
event_next='*code 109 (KEY_PAGEDOWN), value 1*'

evtest "$device" | while read line; do
  case $line in
    ($event_blank) echo "BLANK SCREEN" ;;
    ($event_f5)    echo "F5" ;;
    ($event_esc)   echo "ESCAPE" ;;
    ($event_prev)  echo "PREVIOUS" ;;
    ($event_next)  echo "NEXT" ;;
  esac
done

evtestを使用してデバイスのイベント番号/dev/input/event18を見つけることができましたが、この番号はシステム上のデバイスとそれらが接続された順序によって異なる場合があります

そのため、私はudevadm info /dev/input/event18を使用してデバイスの一意のIDを見つけました

S: input/by-id/usb-Targus_Laser_Presentation_Remote-if02-event-kbd

最後に、もう一度evtestを使用して、デバイスからすべてのイベントをキャッチし、caseステートメントで使用することができました。

0
paulequilibrio