我需要检查一些笔记本电脑的键盘按键,以便尽快提高速度。
对于该特定任务,我什么都没找到,所以我的想法是一个脚本,该脚本可以读取已按下的键并知道所有键盘键,因此我可以快速对其进行重击并报告尚未按下的键。我想我可以使用showkey
or或xev
grepping输出来实现:
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建议更新了脚本。
@Rahul是的,我张贴的是一个字符串。我的测试只是首先使用它,所以无论如何我都发布了。但可以肯定的是,列表更适合于此。感谢您的摘要。
—
mdrg
@Rahul经过一些测试,我有一个几乎可以正常运行的脚本。我用它编辑了问题。
—
mdrg 2013年
list=( a b c d e f Shift_L Return )
是这样吗?