2016-03-07 3 views
0

«Answering a cli prompt in ruby with open3?» - это возможный дублирующий вопрос, но у него нет ответа.Имитация команд командной строки

Мне нужно написать программу, которая компилирует и выполняет программу на языке C, дает входы и возвращает результат. До сих пор я пришел с этим:

Для одного входа:

Open3.popen3('one.exe') do |stdin, stdout, stderr| 
    stdin.puts "45\n" 
    STDOUT.puts stdout.gets 
end 

и выходов:

Enter the temperature in degrees fahrenheit: The converted temperature is 7.222222 

Для двух или более входов:

Open3.popen3('two.exe') do |stdin, stdout, stderr| 
    stdin.puts "45 45" 
# This line works the same as the previous one. 
# stdin.puts "45\r\n45" 
    stdin.close 

    STDOUT.puts stdout.gets 
end 

и выход:

Enter first number: Enter second number: Sum is 90 

Проблема заключается в том, что я не вернусь входы я вставил в.

Есть ли способ я могу исправить это или, может быть, лучший способ сделать это?

ответ

1

Рассмотрим это:

Создайте входной файл с помощью:

cat > test.input 
bar 
baz 

Затем нажмите CTRL + D прекратить ввод, который будет вызывать файл test.input, который будет создан.

В том же каталоге сохранить этот код в test.rb:

2.times do |i| 
    user_input = gets.chomp 
    puts "#{ i }: #{ user_input }" 
end 

Выполнить код с помощью:

ruby test.rb < test.input 

и вы должны увидеть:

0: bar 
1: baz 

Причина это работает потому что gets читает STDIN (по умолчанию), ища линейный конец, который в этом случае является символом, заканчивающимся bar и baz. Если я загружаю файл ввода в IRB легко увидеть содержимое файла:

input = File.read('test.input') 
=> "bar\nbaz\n" 

2.times говорит читать строку дважды, так что он читает обе строки из файла и продолжает выпадать из цикла times ,

Это означает, что вы можете создать файл, передать его в свой скрипт, а Ruby сделает все правильно. Я могу переписать тест.гь код:

puts `sh ./test.sh < #{ ARGV[0] }` 

и создать test.sh:

for i in 1 2 
do 
    read line 
    echo $i $line 
done 

затем вызвать его с помощью:

ruby test.rb test.input 

и получите:

1 bar 
2 baz 

Поскольку обратные кавычки являются один из многих способы вызова суб-ней ll или запустить код, вы можете настроить код вызова и/или дочерний элемент, чтобы прочитать файл. Или Ruby читает ввод и генерирует файл, который будет вызываться. Или исследуйте с помощью Expect, но я не хочу этого никому.

Это должно помочь вам на правильном пути.

+0

Спасибо за ваш ответ. Я пробовал выше примеров, и они работают так, как ожидалось, поэтому я возвращаюсь к своей первоначальной задаче, содержимое ** temp.rb **: 'puts% x [sh ./test.sh

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