Script untuk dengan cepat menguji semua tombol keyboard

14

Saya perlu memeriksa beberapa notebook untuk tombol keyboard yang buruk, dan jadi saya ingin mempercepatnya sebanyak mungkin.

Saya tidak menemukan apa pun untuk tugas khusus ini, jadi ide saya adalah skrip yang membaca tombol yang ditekan dan mengetahui semua tombol keyboard, jadi saya dapat menamparnya dengan cepat dan melaporkan mana yang belum ditekan. Saya kira saya bisa mencapainya dengan salah satu , showkeyatau xevmengambil output:

xev | grep keysym

Output sampel:

state 0x10, keycode 46 (keysym 0x6c, l), same_screen YES,
state 0x10, keycode 33 (keysym 0x70, p), same_screen YES,
state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
state 0x10, keycode 51 (keysym 0x5d, bracketright), same_screen YES,
state 0x10, keycode 36 (keysym 0xff0d, Return), same_screen YES,

The keysym dapat dibaca cukup berguna, tapi saya keed untuk menguji kode kunci, karena mereka tidak berubah sebagai kunci pengubah diaktifkan / nonaktif (caps lock, num lock). Saya baru mengenal bash, jadi saya menyatukan sesuatu. Ini hasil terbaik sejauh ini:

#!/bin/bash

function findInArray() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
    if [[ ${!i} == ${value}* ]]; then
    echo "${!i}"
    return 0
    fi
    }
    echo
    return 1
}

list=( 38:a 56:b 54:c 40:d 26:e 36:Return 50:Shift_L )
xev | \
# old grep solution
# grep -Po '(?<=keycode )[0-9]+(?= \(keysym 0x)' | \
# 200_success' suggestion
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; 
do
  found=$(findInArray "${list[@]}" ${keycode})
  if [[ $found ]]; then
    echo Pressed $found
    list=(${list[@]/${keycode}\:*/})
    echo 'Remaining ===>' ${list[@]}
    if [[ ${#list[@]} == 0 ]]; then
      echo All keys successfully tested!
      pkill xev
      exit 0
    fi
  fi
done

Sementara saya menggunakannya grephanya mencetak output ketika saya menutup xevdan itu tidak akan membunuhnya pada akhirnya. The awkSaran dari @ 200_success memecahkan masalah ini, tetapi tidak mencetak output immediatelly: dibutuhkan 5-6 penekanan tombol untuk output menjadi "memerah". Bagaimana saya bisa memperbaikinya?

Catatan: Saya tahu bahwa skrip ini akan membutuhkan daftar tombol yang berbeda untuk setiap model keyboard yang berbeda, tetapi ini OK, karena saya hanya memiliki beberapa model untuk diuji.


Sunting 1: Saya mengedit pertanyaan dengan kode skrip terbaru saya.

Edit 2: skrip diperbarui sesuai dengan saran 200_success @

mdrg
sumber
3
array seharusnya seperti ini list=( a b c d e f Shift_L Return )bukan?
Rahul Patil
1
paste.ubuntu.com/6115446
Rahul Patil
@Rahul ya, apa yang saya posting adalah string. Tes saya baru saja berhasil, jadi saya tetap memposting. Namun yang pasti, daftar lebih sesuai untuk ini. Terima kasih atas cuplikan Anda.
mdrg
@Rahul Setelah beberapa pengujian, saya memiliki skrip yang hampir berfungsi. Saya mengedit pertanyaan dengan itu.
mdrg

Jawaban:

5

Coba ganti grepbaris Anda dengan awkskrip yang menggelontorkan hasilnya.

xev | \
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; do
    # etc.
done
200_sukses
sumber
Bagus! Saya bisa mengatakan itu selesai, tapi saya bertanya-tanya mengapa perlu begitu banyak penekanan tombol untuk mencetak hasilnya, seperti 'flush' tidak berfungsi. Jika saya menekan 'b', dibutuhkan 5-6 penekanan tombol lainnya untuk Pressed 56:bmuncul.
mdrg
Menemukannya: awk -W interactive. Terima kasih atas bantuan Anda, itu penting.
mdrg
1

Setelah mencoba-coba lagi, Google dan man, versi ini berfungsi seperti yang saya harapkan:

#!/bin/bash

function findInArray() {
  local n=$#
  local value=${!n}
  for ((i=1;i < $#;i++)) {
    if [[ ${!i} == ${value}:* ]]; then
      echo "${!i}"
      return 0
    fi
  }
  echo
  return 1
}

list=( 10:1 11:2 12:3 36:Return 37:Control_L 38:a 39:s 134:Super_R 135:Menu )
clear
echo -e "${#list[@]} keys to test\n\n${list[@]}"
xev | \
awk -W interactive '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; 
do
  found=$(findInArray "${list[@]}" ${keycode})
  if [[ $found ]]; then
    clear
    echo Pressed $found
    list=(${list[@]/$found/})
    remaining=${#list[@]}
    stdbuf -oL -eL echo -e "$remaining keys remaining\n\n${list[@]}"
    if [[ $remaining == 0 ]]; then
      clear
      echo All keys successfully tested!
      pkill xev
      exit 0
    fi
  fi
done

Buat daftar Anda berdasarkan xevoutput (saya terburu-buru digunakan xev | grep keycode, keyboard smash dan penggantian regex pada editor teks) dan menggantinya.

mdrg
sumber