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 showkey
o 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 xev
e alla fine non l'avrebbe ucciso. Il awk
suggerimento 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.
list=( a b c d e f Shift_L Return )
no?