Скрипт для быстрого тестирования всех клавиш клавиатуры


14

Мне нужно проверить некоторые ноутбуки на наличие плохих клавиш на клавиатуре, и поэтому я хотел бы максимально ускорить это.

Я ничего не нашел для этой конкретной задачи, поэтому моя идея - это скрипт, который читает нажатые клавиши и знает все клавиши клавиатуры, поэтому я могу быстро нажимать их и сообщать, какие из них еще не нажаты. Я полагаю, я мог бы сделать это с помощью либо, 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.


3
массив должен как это list=( a b c d e f Shift_L Return )не так ли?
Рахул Патил


@Rahul да, то, что я отправил, является строкой. Мои тесты сначала работали с ним, так что я все равно отправил. Но, конечно, список больше подходит для этого. Спасибо за ваш фрагмент.
mdrg

@Rahul После некоторого тестирования у меня есть почти функциональный скрипт. Я отредактировал вопрос с этим.
mdrg

Ответы:


5

Попробуйте заменить вашу grepстроку awkскриптом, который сбрасывает вывод.

xev | \
awk '/state 0x.*, keycode / { print $4; fflush() }' | \
while read keycode ; do
    # etc.
done

Большой! Я мог бы сказать, что это сделано, но мне было интересно, почему для печати вывода требуется так много нажатий клавиш, как будто «сброс» не работает. Если я нажимаю «b», Pressed 56:bдля появления клавиши требуется 5-6 других нажатий .
2013 г.

Нашел: awk -W interactive. Спасибо за вашу помощь, это было важно.
mdrg

1

После еще нескольких проб и ошибок Google и manэта версия работают, как я ожидал:

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

Создайте свой список на основе xevвывода (я спешно использовал xev | grep keycode, замены клавиатуры и регулярных выражений в текстовом редакторе) и замените его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.