キーボードでどのキーを押したかを知り、その情報を標準出力として印刷したいと思います。
これを行うことができるツールはです。しかし、データを次にshowkey
渡す場合:showkey
read
while read line; do
echo "$line" | otherprog
done <`showkey -a`
または
showkey -a | while read line; do
echo "$line" | otherprog
done
その後、showkey
合計140文字が入力されるのを待ってから、バッファリングされた情報をに送信しますread
。
showkey -a
バッファリングなしで押したキーを1行ずつ印刷します。
- バッファリングする理由は何ですか?
showkey
実際に出力を1行ずつ読み取ることができるように、これらのバッファリングを防ぐにはどうすればよいですか?- どんな選択肢がありますか
showkey
? - 押したキーを直接読むことができるファイルはありますか?
- データをに渡す正しい方法は何ですか
read
?
解決策:
使ったロニックスのソリューションそしてそれを私の簡単なキーボードに含めます:D!
stdbuf -o0 showkey -a | while read line; do
perl -e 'print sprintf "%030s\n",shift' "$line" | aplay &> /dev/null &
done
レーザー船の版:
#!/bin/bash
MP3=(); for i in mp3/*.mp3; do MP3+=("$i"); done
NMP3=${#MP3[@]}
stdbuf -o0 showkey -a 2>/dev/null | while read line; do
[ -z "$line" ] || ! [[ $line =~ ^[0-9] ]] && continue
NUM="$(echo "$line" | awk '{print $2}')"
mplayer "${MP3[$(($NUM % $NMP3))]}" &>/dev/null &
done
同じフォルダに、いくつかのレーザーmp3ファイルをダウンロードというフォルダにmp3
。
答え1
showkey
以下を使用して、出力をバッファリングされていない状態に設定してみてください。stdbuf
注文する:
stdbuf -o0 showkey -a | cat -
ラインをバッファリングする代わりに、キーを押すと出力が表示されます。
stdbuf
stdin
stdout
のバッファリングを調整でき、stderr
に設定してまったく、ラインバッファまたはブロックバッファ、選択可能なブロックサイズがあります。とても便利です。
答え2
端末が線中心線規則に設定されているため、バッファリングされます。あなたはする必要がありますstty raw
。この試み:
state=$(stty -g)
key=$( (stty raw ; dd bs=1 count=1; stty $state) </dev/tty 2>/dev/null)
ただし、これはシングルバイトキーでのみ機能します。LC_ALL=C
入力にマルチバイトキープレスが含まれる可能性がある場合は、まずこれを実行することをお勧めします。より複雑な例は次のとおりです。
{ exit=$(printf '\003')
tty_state=$(stty -g)
stty raw istrip
while key=$(
dd bs=1 count=1
) ; do : "${key:=
}"; printf " %03o %03d %#x\n\r" \
"'$key" "'$key" "'$key"
[ -z "${key#"$exit"}" ] && {
stty "$tty_state"
break
}
done 2>/dev/null
} </dev/tty