将当前按下的键打印到标准输出并逐行读取

pol*_*lym 5 keyboard read

我想知道在我的键盘上按下了哪些键并将信息打印到标准输出。

可以做到这一点的工具是showkey. 但是,如果我想将数据传递showkeyread

while read line; do
  echo "$line" | otherprog
done <`showkey -a`
Run Code Online (Sandbox Code Playgroud)

或者

showkey -a | while read line; do
  echo "$line" | otherprog
done
Run Code Online (Sandbox Code Playgroud)

然后showkey等待,直到输入了 140 个字符的总和,然后将缓冲的信息发送到read

showkey -a 逐行打印按下的键,没有任何缓冲。

  1. 为什么要缓冲?
  2. 如何避免这种缓冲,以便我可以showkey真正逐行读取的输出?
  3. 有替代品showkey吗?
  4. 是否有我可以直接从中读取按键的文件?
  5. 将数据传递给的正确方法是什么read

解决方案:

我使用了lornix的解决方案并将其包含在我的简单键盘键盘中:D!

stdbuf -o0 showkey -a | while read line; do
  perl -e 'print sprintf "%030s\n",shift' "$line" | aplay &> /dev/null &
done
Run Code Online (Sandbox Code Playgroud)

镭射版:

#!/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
Run Code Online (Sandbox Code Playgroud)

在同一文件夹中,将一些激光 mp3 文件下载到名为mp3.

lor*_*nix 5

尝试showkey使用以下stdbuf命令将输出设置为非缓冲:

stdbuf -o0 showkey -a | cat -
Run Code Online (Sandbox Code Playgroud)

将在按下键时显示输出,而不是缓冲一行。

stdbuf可以调整stdinstdout和的缓冲stderr,将它们设置为noneline bufferedblock buffered,并具有可选择的块大小。非常便利。