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

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

일부 노트북 키보드 키의 손상 여부를 확인해야 하므로 작업 속도를 최대한 높이고 싶습니다.

이 특정 작업에 대한 정보를 찾지 못했기 때문에 내 아이디어는 누른 키를 읽고 모든 키보드 키를 알고 있으므로 신속하게 키를 누르고 아직 누르지 않은 키를 보고하는 스크립트입니다. 나는 showkey이 작업을 수행하기 위해 xevgrep 출력을 사용할 수 있다고 생각합니다.

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,

읽을 수 있는 키 기호는 매우 유용하지만 보조 키를 켜거나 끌 때(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

내가 그것을 사용하면 grepshutdown 시 출력만 인쇄하고 xev결국 종료되지도 않습니다. @200_success의 제안으로 awk문제가 해결되었지만 출력이 즉시 인쇄되지는 않습니다. 출력을 "새로 고침"하려면 5-6번의 키 입력이 필요합니다. 이 문제를 어떻게 해결할 수 있나요?

참고: 이 스크립트는 각 키보드 모델마다 다른 키 목록을 제공해야 한다는 것을 알고 있지만 테스트할 모델이 몇 개밖에 없으므로 괜찮습니다.


편집 1: 최신 스크립트 코드로 질문을 편집했습니다.

편집 2: @200_success가 제안한 대로 스크립트를 업데이트했습니다.

답변1

grep줄을 다음 스크립트로 바꿔보세요awk붉히다그 출력.

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

답변2

왜 이렇게 긴 과정을 거쳤나요? 노력하다키보드 테스터 io, 저는 이 문제를 해결하기 위해 이 글을 썼습니다.

시중의 다른 테스터보다 훨씬 낫습니다.

답변3

더 많은 시행착오와 인터넷 검색을 거친 후 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텍스트 편집기에서 키보드 스매싱 및 정규식 대체를 서둘러 사용했습니다) 교체합니다.

관련 정보