Мне нужно проверить некоторые ноутбуки на наличие плохих клавиш на клавиатуре, и поэтому я хотел бы максимально ускорить это.
Я ничего не нашел для этой конкретной задачи, поэтому моя идея - это скрипт, который читает нажатые клавиши и знает все клавиши клавиатуры, поэтому я могу быстро нажимать их и сообщать, какие из них еще не нажаты. Я полагаю, я мог бы сделать это с помощью либо, showkey
либо xev
, получая вывод:
xev | grep keysym
Пример вывода:
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,
Считываемый keysym весьма полезен, но я хотел протестировать коды клавиш, так как они не меняются при включении / выключении клавиш-модификаторов (caps lock, num lock). Я новичок в Bash, так что я собираю что-то вместе. Это лучший результат на данный момент:
#!/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
В то время как я использовал grep
его, он печатал только выходные данные, когда я закрывался, xev
и в конце он тоже не убивал. awk
Предложение от @ 200_success решить эти проблемы, но не печатает вывод мгновенным: она занимает 5-6 нажатий клавиша для выхода , чтобы быть «покраснели». Как я могу это исправить?
Примечание: я знаю, что для этого сценария потребуется разный список клавиш для каждой модели клавиатуры, но это нормально, так как у меня есть только пара моделей для тестирования.
Редактировать 1: я редактировал вопрос с моим последним кодом сценария.
Изменить 2: скрипт обновлен в соответствии с предложением @ 200_success.
list=( a b c d e f Shift_L Return )
не так ли?