Передача stdin в скрипт ruby ​​через `myapp |myscript.rb` - PullRequest
3 голосов
/ 07 июля 2010

У меня есть приложение, которое работает непрерывно, выгружая выходные данные с сервера и отправляя строки на стандартный вывод.Я хочу обработать этот вывод сценарием Ruby.Строки определяются \n.

Например, я пытаюсь запустить это в командной строке:

myapp.exe | my_script.rb

... с помощью my_script.rb определен как:

while $stdin.gets
    puts $_
end

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

my_script.rb:1:in `gets': Bad file descriptor (Errno::EBADF)
        from my_script.rb:1

Я запускаю это на Windows Server 2003 R2 SP2 и Ruby 1.8.6.

Как непрерывно обрабатывать стандартный ввод вскрипт на Ruby?(Непрерывно, как при не обработке файла, так и до тех пор, пока я его не уничтожу.)

РЕДАКТИРОВАТЬ:

Я смог сделать эту работу, вроде.На моем пути было несколько проблем.С одной стороны, может случиться так, что использование Ruby для обработки переданного по каналу stdin из другого процесса не работает в Windows 2003R2 .Другое направление, предложенное Адрианом ниже, состояло в том, чтобы запустить мой скрипт как родительский процесс и использовать popen для подключения к myapp.exe как fork ed дочерний процесс.К сожалению, fork не реализован в Windows, поэтому это тоже не сработало.

Наконец я смог загрузить POpen4 , RubyGem, который реализует popen в Windows,Используя это в сочетании с предложением Адриана, я смог написать этот скрипт, который делает то, что я действительно хочу - обрабатывает вывод из myapp.exe:

file: my_script.rb

require 'rubygems'
require 'popen4'

 status =
    POpen4::popen4("myapp.exe") do |stdout, stderr, stdin, pid|
        puts pid
        while s = stdout.gets
            puts s
        end

    end

Этот скрипт повторяет вывод myapp.exe, что именно то, что я хочу.

Ответы [ 3 ]

2 голосов
/ 07 июля 2010

Попробуйте просто gets, без $stdin. Если это не сработает, вам, возможно, придется проверить вывод myapp.exe для непечатных символов с помощью другого скрипта ruby, используя IO.popen.

0 голосов
/ 29 декабря 2010

Попробуйте выполнить сценарий Ruby, явно вызвав ruby:

myapp.exe | ruby my_script.rb

Я столкнулся с некоторым странным поведением при использовании stdin в Ruby, когда полагался на Windows для вызова правильной программы на основе ассоциаций файлов.

0 голосов
/ 07 июля 2010

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

См. SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...