我想知道在我的键盘上按下了哪些键并将信息打印到标准输出。
可以做到这一点的工具是showkey
. 但是,如果我想将数据传递showkey
给read
:
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
逐行打印按下的键,没有任何缓冲。
showkey
真正逐行读取的输出?showkey
吗?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
.
尝试showkey
使用以下stdbuf
命令将输出设置为非缓冲:
stdbuf -o0 showkey -a | cat -
Run Code Online (Sandbox Code Playgroud)
将在按下键时显示输出,而不是缓冲一行。
stdbuf
可以调整stdin
、stdout
和的缓冲stderr
,将它们设置为none、line buffered或block buffered,并具有可选择的块大小。非常便利。