从命令流信息中检索输出

时间:2013-06-02 00:47:19

标签: bash stream pipe output

这个头衔很紧张......很难描述我的兴趣,更为精简的方式。


感谢akostadinov的回复,我对斯坦丁的无知感到宽慰。这是解决方案。原始问题遵循解决方案......

我总是将管道与输出相关联,就好像它是单侧连接一样。 我用管子直接输出。

但是,当然,你正在将它指向某个地方,并将它的管道用于输入。 这是我第一次使用或甚至考虑使用stdin。

stdin完美地解决了这个问题。

我正在编写一个天真的程序,将我的midi键盘变成键盘输入设备。 该程序服务于其目的,特别是现在我的资源消耗为零,但它的功能比我预期的更好。 现在我用我的电子键盘进行编程,如果我遇到障碍或者只是在重复的代码上被烧毁,我会调高钢琴直到我能够再次工作。

... nutes

#!/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脚本,该脚本读取最近一行并处理最后一行的信息。

我该怎么做?

我试图将输出设置为变量,但是很难按照我的预期进行操作。

然后我将输出传输到一个文件并从文件中读取,该文件工作正常,但文件很快就填满了,所以我试图只将文件的最后十行反馈回自身,但这会导致管道崩溃。 / p>

最后,我编写了一个单独的脚本来确定输出文件中的行数,如果它超过上限就会终止进程,将最后十行放入自身,然后使用附加管道重新启动命令。然后它等待并在需要时再次执行。

这种最终方法只是在攫取资源。跑步时约占8%,闲置时占17%和14%。

我想要的只是从正在运行的命令中读取最新的输出。

如果不吸收太多的CPU,我怎么能做我想做的事?

1 个答案:

答案 0 :(得分:2)

运行您的脚本,如:

aseqdump | myscript.sh

然后,脚本进程的标准输出将是aseqdump的输出。使用read bash内置命令从stdin读取行。你通常会这样:

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

顺便说一句,你的其他方法应该不需要那么多CPU使用率。也许你有一个经常执行的循环。也许如果你插入1秒的睡眠时间,那么CPU将大幅减少。另一种可能性是你使用一些非常低效的方式来做某事但是如果不看代码就不能说。