Script per testare rapidamente tutti i tasti della tastiera


14

Ho bisogno di controllare alcuni notebook per i tasti della tastiera danneggiati, e quindi vorrei accelerare il più possibile.

Non ho trovato nulla per questo compito specifico, quindi la mia idea è uno script che legge i tasti premuti e conosce tutti i tasti della tastiera, quindi posso batterli rapidamente e segnala quali non sono ancora stati premuti. Suppongo di poterlo fare con uno dei due showkeyo xev, grepping dell'output:

xev | grep keysym

Uscita campione:

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,

Il keysym leggibile è abbastanza utile, ma mi preme testare i codici chiave, poiché non cambiano quando i tasti modificatori vengono attivati ​​/ disattivati ​​(blocco maiuscole, blocco numerico). Sono nuovo a colpire, quindi sto mettendo insieme qualcosa. Questo è il miglior risultato finora:

#!/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

Mentre l'ho usato grep , stavo stampando l'output solo quando ho chiuso xeve alla fine non l'avrebbe ucciso. Il awksuggerimento di @ 200_success ha risolto questi problemi, ma non stampa immediatamente l'output: sono necessari 5-6 sequenze di tasti affinché l'output sia "svuotato". Come posso ripararlo?

Nota: so che questo script richiederebbe un diverso elenco di tasti per ogni diverso modello di tastiera, ma va bene, dato che ho solo un paio di modelli da testare.


Modifica 1: ho modificato la domanda con il mio ultimo codice di script.

Modifica 2: script aggiornato secondo il suggerimento @ 200_success.


3
array dovrebbe piacere, list=( a b c d e f Shift_L Return )no?
Rahul Patil,


@Rahul sì, quello che ho pubblicato è una stringa. I miei test hanno funzionato per primi, quindi ho pubblicato comunque. Ma sicuramente, un elenco è più appropriato per questo. Grazie per il tuo frammento.
mdrg,

@Rahul Dopo alcuni test, ho uno script quasi funzionale. Ho modificato la domanda con esso.
mdrg

Risposte:


5

Prova a sostituire la grepriga con uno awkscript che cancella il suo output.

xev | \
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; do
    # etc.
done

Grande! Potrei dire che è fatto, ma mi chiedevo perché ci vogliono così tanti tasti per stampare l'output, come se il 'flush' non funzionasse. Se premo 'b', ci vogliono 5-6 altri tasti per Pressed 56:bfar apparire.
mdrg,

Trovato: awk -W interactive. Grazie per il tuo aiuto, è stato essenziale.
mdrg,

1

Dopo alcuni tentativi ed errori, Google e manquesta versione funzionano come mi aspettavo:

#!/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

Crea il tuo elenco in base xevall'output (ho usato in fretta xev | grep keycode, sostituzioni di tastiera e regex su un editor di testo) e sostituiscilo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.