Мені потрібно перевірити деякі ноутбуки на наявність поганих клавіш клавіатури, і тому я хотів би максимально прискорити це.
Я не знайшов нічого для цієї конкретної задачі, тому моя ідея - це сценарій, який читає натиснуті клавіші і знає всі клавіші клавіатури, тому я можу швидко їх збити, і він повідомляє, які ще не натиснуті. Я припускаю, що я міг би це досягти або з, 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,
Зчитуваний keyym є досить корисним, але я прагну тестувати клавіші, оскільки вони не змінюються, коли ключі модифікатора включаються / вимикаються (cap lock, num lock). Я новачок у баші, тому щось складаю. Це найкращий результат поки що:
#!/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 )
чи не так?