Script pour tester rapidement toutes les touches du clavier

14

Je dois vérifier certains ordinateurs portables pour les mauvaises touches du clavier, et je voudrais donc accélérer cela autant que possible.

Je n'ai rien trouvé pour cette tâche spécifique, donc mon idée est un script qui lit les touches pressées et connaît toutes les touches du clavier, donc je peux les frapper rapidement et il signale celles qui ne sont pas encore pressées. Je suppose que je pourrais accomplir cela avec showkeyou xev, en saluant la sortie:

xev | grep keysym

Exemple de sortie:

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,

Le keyym lisible est assez utile, mais je keed pour tester les codes clés, car ils ne changent pas car les touches de modification sont activées / désactivées (verrouillage des majuscules, verrouillage numérique). Je suis nouveau à bash, donc je prépare quelque chose. C'est le meilleur résultat jusqu'à présent:

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

Pendant que je l'utilisais, je grepn'imprimais la sortie qu'à la fermeture xevet cela ne la tuerait pas à la fin aussi. La awksuggestion de @ 200_success a résolu ces problèmes, mais elle n'imprime pas immédiatement la sortie: il faut 5-6 frappes pour que la sortie soit "vidée". Comment puis-je résoudre ce problème?

Remarque: Je sais que ce script nécessiterait une liste de touches différente pour chaque modèle de clavier différent, mais c'est OK, car je n'ai que quelques modèles à tester.


Edit 1: J'ai édité la question avec mon dernier code de script.

Edit 2: script mis à jour conformément à la suggestion @ 200_success.

mdrg
la source
3
tableau devrait aimer ce list=( a b c d e f Shift_L Return )n'est- ce pas?
Rahul Patil
1
paste.ubuntu.com/6115446
Rahul Patil
@Rahul oui, ce que j'ai publié est une chaîne. Mes tests ont tout d'abord fonctionné avec, donc j'ai quand même posté. Mais sûrement, une liste est plus appropriée pour cela. Merci pour votre extrait.
mdrg
@Rahul Après quelques tests, j'ai un script presque fonctionnel. J'ai édité la question avec.
mdrg

Réponses:

5

Essayez de remplacer votre grepligne par un awkscript qui vide sa sortie.

xev | \
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; do
    # etc.
done
200_success
la source
Génial! Je pourrais dire que c'est fait, mais je me demandais pourquoi cela prend-il autant de touches pour imprimer la sortie, comme si le «rinçage» ne fonctionnait pas. Si j'appuie sur «b», il faut 5-6 autres touches pour que le Pressed 56:bs'affiche.
mdrg
Je l' ai trouvé: awk -W interactive. Merci pour votre aide, c'était essentiel.
mdrg
1

Après quelques essais et erreurs supplémentaires, Google et man, cette version fonctionne comme prévu:

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

Créez votre liste en fonction de la xevsortie (je l'ai utilisé avec hâte xev | grep keycode, remplacements de smash clavier et regex sur un éditeur de texte) et remplacez-la.

mdrg
la source