2013-06-02 1 views
1

Это название напряжено ... сложно описать мои интересы, тем более, чтобы сделать это в ясной форме.Получение результата из командной потоковой информации


Благодаря ответу от акостадинов, я был освобожден от моего незнания о stdin. Вот решение. Оригинальный вопрос следует за решением ...

Я всегда связываю трубу с выходом, как если бы это было одностороннее соединение. Я использовал трубы для прямого вывода.

Но, конечно, вы направляете его куда-то, и это место, где ваш трубопровод использует его как вход. Это первый раз в программе, которую я использовал или даже думал использовать, stdin.

stdin исправил проблему отлично.

Я писал наивную программу, чтобы превратить мою миди-клавиатуру в устройство ввода клавиатуры типа. Программа служит своей цели, особенно теперь, когда у меня есть расход ресурсов, работающий на ноль, но функция этого оказалось лучшей идеей, чем я ожидал. Теперь я программирую с помощью своей электронной клавиатуры, и если я ударяю обломок или просто сжигаю на повторяющемся коде, я включаю пианино и просто играю, пока не смогу снова работать.

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, который читается в последней строке и обрабатывает информацию из этой последней строки.

Как я могу это сделать?

Я попытался установить выход как переменную, но с трудом делал эту работу так, как я предполагал.

Затем я отправил вывод в файл и прочитал из файла, который работал нормально, но файл быстро заполнился, поэтому я попытался вернуть только последние десять строк файла в себя, но это разбило трубку.

В конце я написал отдельный скрипт, который определяет количество строк в выходном файле, если он превышает верхний предел, который он убивает, коты последних десяти строк в себя, а затем перезапускает команду с помощью присоединяемого канала , Затем он ждет и делает это снова, когда это необходимо.

Этот последний метод - это просто пережевывание ресурсов. Около 8% при работе и 17% и 14% при холостом ходу.

Все, что я хочу, это прочитать последний результат выполнения команды.

Как я могу сделать то, что хочу, не всасывая столько CPU?

+0

Вы можете использовать aseqdump | tail -f - это дает самый последний вывод из команды –

ответ

2

запустить сценарий как:

aseqdump | myscript.sh 

Тогда стандартный ввод вашего процесса сценария будет вывод aseqdump. Используйте встроенную команду bash read для чтения строк из stdin. Вы, как правило, что-то вроде этого:

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

кстати, что ваш другой подход не должен не нужно так много использования процессора. Возможно, у вас есть цикл, который выполняется слишком часто. Возможно, если вы введете время сна, скажем, 1 секунду, то процессор резко уменьшится. Другая возможность заключается в том, что вы используете очень неэффективный способ сделать что-то, но это нельзя сказать, не глядя на код.

+0

приятно, спасибо. – Peregrine

 Смежные вопросы

  • Нет связанных вопросов^_^