現在押しているキーを標準出力として印刷し、1行ずつ読み込みます。

現在押しているキーを標準出力として印刷し、1行ずつ読み込みます。

キーボードでどのキーを押したかを知り、その情報を標準出力として印刷したいと思います。

これを行うことができるツールはです。しかし、データを次にshowkey渡す場合:showkeyread

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行ずつ印刷します。

  1. バッファリングする理由は何ですか?
  2. showkey実際に出力を1行ずつ読み取ることができるように、これらのバッファリングを防ぐにはどうすればよいですか?
  3. どんな選択肢がありますかshowkey
  4. 押したキーを直接読むことができるファイルはありますか?
  5. データをに渡す正しい方法は何ですか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 -

ラインをバッファリングする代わりに、キーを押すと出力が表示されます。

stdbufstdinstdoutのバッファリングを調整でき、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

関連情報