일부 키보드에 잘못된 키보드 키가 있는지 확인해야하므로 최대한 빨리 속도를 높이고 싶습니다.
나는이 특정 작업에 대해 아무것도 발견하지 못했기 때문에 내 생각은 눌린 키를 읽고 모든 키보드 키를 아는 스크립트이므로 빠르게 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 제안에 따라 스크립트가 업데이트되었습니다.
list=( a b c d e f Shift_L Return )
은 그렇지 않습니까?