Как передать данные через STDIN нескольким внешним командам в ruby

Этот вопрос немного похож на мой предыдущий (отвеченный) вопрос:

Как запустить несколько внешних команд в фоновом режиме в рубин

Но в этом случае я ищу способ передать рубиновые строки через STDIN внешним процессам, что-то вроде этого (приведенный ниже код недействителен, но иллюстрирует мою цель):

#!/usr/bin/ruby

str1 = 'In reality a relatively large string.....'
str2 = 'Another large string'
str3 = 'etc..'

spawn 'some_command.sh', :stdin => str1
spawn 'some_command.sh', :stdin => str2
spawn 'some_command.sh', :stdin => str3

Process.waitall

person Erik    schedule 14.01.2011    source источник


Ответы (2)


Кажется, это работает:

data = [str1, str2, str3]

data.each do |input|
  fork do
    IO.popen(COMMAND, 'r+'){|n| n.print input}
  end
end

Process.waitall
person Erik    schedule 14.01.2011
comment
Разве процессы не более эффективны в Unix? Процессы распределяются между доступными ЦП/ядрами. - person Erik; 14.01.2011
comment
вы уже запускаете новый процесс с помощью popen (он создает процесс и канал для связи с ним). Таким образом, с fork вы создаете два процесса для каждой команды. - person Luis; 14.01.2011

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

alpha = IO.popen( "some shell command" , 'r+' ) 
bravo = IO.popen( "other command" , 'r+' ) 

ARGF.each_line do |line| 
  alpha << line
  bravo << line 
end
person garrow    schedule 01.11.2011