一部のノートブックキーボードキーが損傷しているかどうかを確認する必要があるため、作業速度を最大限に高めたいと思います。
この特定のタスクに関する情報が見つからなかったため、私のアイデアは、押したキーを読んですべてのキーボードキーを知っているので、すぐにキーを押してまだ押されていないキーを報告するスクリプトです。私はshowkey
これを行うためにxev
grep出力を使うことができると思います。
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
私がそれを使用すると、grep
shutdown時に出力のみを印刷し、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
テキストエディタでキーボードスマッシングと正規表現の置換を急いで使用しました)、置き換えます。