1

这个标题很紧张……很难描述我的兴趣,更不用说用简洁的方式来形容了。


多亏了 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 的情况下做我想做的事?

4

1 回答 1

2

像这样运行你的脚本:

aseqdump | myscript.sh

然后你的脚本进程的标准输入将是aseqdump. 使用readbash 内置命令从标准输入读取行。你通常会是这样的:

while read -r LINE; do
   <take action according to $LINE>
done

顺便说一句,您的其他方法不需要太多的 CPU 使用率。也许您有一个执行过于频繁的循环。也许如果您插入 1 秒的睡眠时间,那么 CPU 将急剧下降。另一种可能性是您正在使用一些非常低效的方式来做某事,但是如果不查看代码就无法说出来。

于 2013-06-02T03:38:24.210 回答