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 showkey
ou 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 grep
n'imprimais la sortie qu'à la fermeture xev
et cela ne la tuerait pas à la fin aussi. La awk
suggestion 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.
list=( a b c d e f Shift_L Return )
n'est- ce pas?