这个标题很紧张……很难描述我的兴趣,更不用说用简洁的方式来形容了。
多亏了 akostadinov 的回复,我才从对 stdin 的无知中解脱出来。这是解决方案。原始问题遵循解决方案......
我总是将管道与输出相关联,就好像它是单向连接一样。我使用管道来直接输出。
但是,当然,您将它引导到某个地方,而您的管道将其用作输入。这是我第一次使用或什至考虑使用标准输入的程序。
标准输入完美地解决了这个问题。
我正在编写一个幼稚的程序来将我的 MIDI 键盘变成类型键盘输入设备。该程序达到了它的目的,特别是现在我的资源消耗为零,但结果证明它的功能比我预期的要好得多。现在我用我的电子键盘编程,如果我遇到障碍或者只是被重复的代码烧毁了,我会调大钢琴弹奏,直到我能够再次工作。
坚果...
#!/bin/bash
while [ 17 ]; do
olea=""
aseqdump -p 20 | {
while read line ; do
a=($line)
if [ "$olea" != "$line" ];then
b=${a[5]}
if [ $b ]; then
lenny=${#b}
last=${b:$lenny-1:$lenny}
if [ "$last" == "," ]; then
b=${b:0:$lenny-1}
fi
fi
c=${a[4]}
case "$b" in
#7h3 0c74v35
"60") if [ "${a[2]}" == "on" ]; then `/home/pikey/./xsendkeycode 54 1`; else `/home/pikey/./xsendkeycode 54 0`;fi;; #echo -ne "c"; echo -ne "c">>textfile ;;
"62") if [ "${a[2]}" == "on" ]; then `/home/pikey/./xsendkeycode 40 1`; else `/home/pikey/./xsendkeycode 40 0`;fi;; #echo -ne "d"; echo -ne "d">>textfile ;;
"64") if [ "$c" == "controller" ]; then
valdue=${a[7]}
if [ "$valdue" == "127" ]; then
`/home/pikey/./xsendkeycode 62 1` #shft
else
`/home/pikey/./xsendkeycode 62 0` #shft
fi
else
if [ "${a[2]}" == "on" ]; then
`/home/pikey/./xsendkeycode 26 1`
else
`/home/pikey/./xsendkeycode 26 0`
fi
#echo -ne "e"
#echo -ne "e">>textfile
fi;;
"65") if [ "${a[2]}" == "on" ]; then `/home/pikey/./xsendkeycode 41 1`; else `/home/pikey/./xsendkeycode 41 0`;fi;; #echo -ne "f"; echo -ne "f">>textfile ;;
"67") if [ "${a[2]}" == "on" ]; then `/home/pikey/./xsendkeycode 42 1`; else `/home/pikey/./xsendkeycode 42 0`;fi;; #echo -ne "g"; echo -ne "g">>textfile ;;
"69") if [ "${a[2]}" == "on" ]; then `/home/pikey/./xsendkeycode 38 1`; else `/home/pikey/./xsendkeycode 38 0`;fi;; #echo -ne "a"; echo -ne "a">>textfile ;;
"71") if [ "${a[2]}" == "on" ]; then `/home/pikey/./xsendkeycode 56 1`; else `/home/pikey/./xsendkeycode 56 0`;fi;; #echo -ne "b"; echo -ne "b">>textfile ;;
esac
fi
olea="$line"
done
}
done
它会让人分心。
基本上我正在运行一个名为 aseqdump 的命令。从手册页:
NAME
aseqdump - show the events received at an ALSA sequencer port
SYNOPSIS
aseqdump [-p client:port,...]
运行程序时,会监听客户端并输出客户端状态。
在我的使用中,我正在听一个 MIDI 设备。
输出不断刷新。
我正在尝试编写一个 bash 脚本,该脚本读取最近一行并处理最后一行的信息。
我怎样才能做到这一点?
我试图将输出设置为变量,但是很难按照我的预期进行这项工作。
然后我将输出通过管道传输到一个文件并从该文件中读取,这工作正常但文件很快填满,所以我尝试只将文件的最后十行返回到自身,但这会使管道崩溃。
最后,我编写了一个单独的脚本来确定输出文件中的行数,如果超过上限,它将终止进程,将最后十行放入自身,然后使用附加管道重新启动命令。然后它等待并在需要时再次执行。
最后一种方法只是在消耗资源。运行时约为 8%,怠速时约为 17% 和 14%。
我想要的只是从正在运行的命令中读取最新的输出。
如何在不占用这么多 CPU 的情况下做我想做的事?