모든 키보드 키를 빠르게 테스트하는 스크립트


14

일부 키보드에 잘못된 키보드 키가 있는지 확인해야하므로 최대한 빨리 속도를 높이고 싶습니다.

나는이 특정 작업에 대해 아무것도 발견하지 못했기 때문에 내 생각은 눌린 키를 읽고 모든 키보드 키를 아는 스크립트이므로 빠르게 bash 할 수 있으며 아직 눌리지 않은 키를보고합니다. 나는 중 하나와 그것을 달성 할 수 있다고 가정 showkey이나 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,

읽을 수있는 keysym은 매우 유용하지만 수정 자 키가 켜지거나 꺼질 때 변경되지 않기 때문에 키 코드를 테스트하려고했습니다 (캡 잠금, 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 Patil


@Rahul 예, 내가 게시 한 것은 문자열입니다. 내 테스트가 먼저 작동했기 때문에 어쨌든 게시했습니다. 그러나 분명히 목록이 더 적합합니다. 스 니펫 주셔서 감사합니다.
mdrg

@Rahul 약간의 테스트 후에 거의 기능적인 스크립트가 있습니다. 질문을 편집했습니다.
mdrg

답변:


5

출력 을 플러시grep 하는 awk스크립트로 라인을 교체하십시오 .

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

큰! 나는 그것이 끝났다고 말할 수 있지만, '플러시'가 작동하지 않는 것처럼 출력을 인쇄하기 위해 너무 많은 키 입력이 필요한 이유가 궁금합니다. 'b'를 누르면 5-6 번의 다른 키 입력 Pressed 56:b이 나타납니다.
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텍스트 편집기에서 키보드 스매시 및 정규식 대체를 신속하게 사용)을 기반으로 목록을 작성 하고 바꿉니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.