Script để nhanh chóng kiểm tra tất cả các phím bàn phím


14

Tôi cần kiểm tra một số máy tính xách tay để tìm các phím bàn phím xấu và vì vậy tôi muốn tăng tốc độ đó càng nhiều càng tốt.

Tôi không tìm thấy gì cho tác vụ cụ thể này, vì vậy ý ​​tưởng của tôi là một tập lệnh đọc các phím được nhấn và biết tất cả các phím trên bàn phím, vì vậy tôi có thể bash chúng nhanh chóng và nó báo cáo những phím nào chưa được nhấn. Tôi cho rằng tôi có thể thực hiện điều đó bằng một trong hai showkeyhoặc xev, lấy đầu ra:

xev | grep keysym

Đầu ra mẫu:

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,

Các keyym có thể đọc được khá hữu ích, nhưng tôi cần kiểm tra các mã phím, vì chúng không thay đổi khi các phím bổ trợ được bật / tắt (khóa mũ, khóa num). Tôi mới làm quen với bash, vì vậy tôi sẽ đặt một cái gì đó lại với nhau. Đây là kết quả tốt nhất cho đến nay:

#!/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

Mặc dù tôi đã sử dụng grepnhưng nó chỉ in đầu ra khi tôi đóng xevvà cuối cùng nó cũng không giết được. Các awkgợi ý từ @ 200_success giải quyết những vấn đề này, nhưng nó không in ra immediatelly: phải mất 5-6 tổ hợp phím cho đầu ra là "đỏ mặt". Lam sao tôi co thể sửa no?

Lưu ý: Tôi biết rằng tập lệnh này sẽ yêu cầu một danh sách các phím khác nhau cho từng kiểu bàn phím khác nhau, nhưng điều này không sao, vì tôi chỉ có một vài kiểu để kiểm tra.


Chỉnh sửa 1: Tôi đã chỉnh sửa câu hỏi với mã tập lệnh mới nhất của mình.

Chỉnh sửa 2: tập lệnh được cập nhật theo đề xuất @ 200_success.


3
Mảng như thế này list=( a b c d e f Shift_L Return )phải không?
Rahul Patil


@Rahul vâng, những gì tôi đăng là một chuỗi. Các bài kiểm tra của tôi chỉ hoạt động đầu tiên với nó, vì vậy tôi vẫn đăng. Nhưng chắc chắn, một danh sách phù hợp hơn cho việc này. Cảm ơn cho đoạn trích của bạn.
mdrg

@Rahul Sau một số thử nghiệm, tôi có một kịch bản gần như chức năng. Tôi đã chỉnh sửa câu hỏi với nó.
mdrg

Câu trả lời:


5

Hãy thử thay thế grepdòng của bạn bằng một awktập lệnh tuôn ra đầu ra của nó.

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

Tuyệt quá! Tôi có thể nói rằng nó đã được thực hiện, nhưng tôi đã tự hỏi tại sao phải mất quá nhiều tổ hợp phím để in đầu ra, như thế 'tuôn ra' không hoạt động. Nếu tôi nhấn 'b', phải mất 5-6 lần nhấn phím khác Pressed 56:bđể xuất hiện.
mdrg

Tìm thấy nó : awk -W interactive. Cảm ơn sự giúp đỡ của bạn, nó rất cần thiết.
mdrg

1

Sau một số thử nghiệm và lỗi khác, Google và man, phiên bản này hoạt động như tôi mong đợi:

#!/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

Tạo danh sách của bạn dựa trên xevđầu ra (tôi đã sử dụng một cách vội vã xev | grep keycode, đập bàn phím và thay thế regex trên trình soạn thảo văn bản) và thay thế nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.