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 showkey
hoặ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 grep
nhưng nó chỉ in đầu ra khi tôi đóng xev
và cuối cùng nó cũng không giết được. Các awk
gợ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.
list=( a b c d e f Shift_L Return )
phải không?