Сценарій для швидкої перевірки всіх клавіш клавіатури


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,

Зчитуваний 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.


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 інших натискань клавіш .
mdrg

Знайшов: 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.