标题是紧张的…很难描述我的兴趣,更难以用一种简洁的方式来描述。
多亏了akostadinov的回复,我才从对stdin的无知中解脱出来。这就是解决方案。原来的问题遵循解决方案…
我总是将管道与输出联系起来,就好像它是一个单面连接。我使用管道来直接输出。
但是,当然,您正在引导它到某个地方,并且您的管道将它用作输入。这是我第一次在程序中使用,甚至是想到使用stdin。
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的情况下做我想做的事情?
像这样运行脚本:
aseqdump | myscript.sh
那么脚本进程的stdin将是aseqdump
的输出。使用read
bash内置命令从stdin中读取行。你通常会是这样的:
while read -r LINE; do
<take action according to $LINE>
done
顺便说一句,你的其他方法不应该需要这么多的CPU使用。也许你的循环执行得太频繁了。也许如果您插入1秒的睡眠时间,那么CPU将急剧减少。另一种可能性是,您使用了一些非常低效的方法来执行某些操作,但如果不查看代码就无法说明。