从命令流信息中检索输出



标题是紧张的…很难描述我的兴趣,更难以用一种简洁的方式来描述。


多亏了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将急剧减少。另一种可能性是,您使用了一些非常低效的方法来执行某些操作,但如果不查看代码就无法说明。

相关内容

  • 没有找到相关文章

最新更新