快速测试所有键盘按键的脚本


14

我需要检查一些笔记本电脑的键盘按键,以便尽快提高速度。

对于该特定任务,我什么都没找到,所以我的想法是一个脚本,该脚本可以读取已按下的键并知道所有键盘键,因此我可以快速对其进行重击并报告尚未按下的键。我想我可以使用showkeyor或xevgrepping输出来实现:

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非常有用,但我希望测试键代码,因为随着修饰符键的开/关(大写锁定,num锁定)它们不会改变,因此它们不愿意更改。我是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 2013年

Answers:


5

尝试用刷新其输出grepawk脚本替换行。

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

大!我可以说已经完成了,但是我想知道为什么要花这么多的击键来打印输出,就像“刷新”不起作用一样。如果按“ b”键,则需要5 Pressed 56:b到6次其他击键才能出现。
mdrg 2013年

找到了:awk -W interactive。感谢您的帮助,这很重要。
mdrg 2013年

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,在文本编辑器上键盘粉碎和正则表达式替换)创建列表并替换它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.