将当前按下的键打印到stdout并逐行读取

Modified on: Sat, 30 Jun 2018 09:49:30 +0800

我想知道键盘上按了哪些键并将信息打印到stdout。

可以执行此操作的工具是showkey。但是,如果我想将showkey的数据传递给read

读取行时

while read line; do
  echo "$line" | otherprog
done <`showkey -a`

OR

showkey -a | while read line; do
  echo "$line" | otherprog
done

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

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

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

    解决方案:

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

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

    Lasership版本:

    #!/bin/bash MP3=(); for i in mp3/*.mp3; do MP3+=("$i"); done NMP3=${#MP3[@]} stdbuf -o0 showkey -a 2&gt;/dev/null | while read line; do [ -z "$line" ] || ! [[ $line =~ ^[0-9] ]] &amp;&amp; continue NUM="$(echo "$line" | awk '{print $2}')" mplayer "${MP3[$(($NUM % $NMP3))]}" &amp;&gt;/dev/null &amp; done

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

作者:Community,polym

最佳答案

尝试使用showkey命令:

stdbuf -o0 showkey -a | cat -

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

stdbuf可以调整stdinstdoutstderr的缓冲,将它们设置为none行缓冲阻止缓存,具有可选择的块大小。非常方便。

作者:lornix

相关问答

添加新评论