2016-03-07 205 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(默認情況下)查找行結束,在這種情況下是跟隨barbaz的字符。如果我在IRB加載輸入文件可以很容易地看到文件的內容:

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

2.times說,讀線的兩倍,因此它從文件中讀取兩行並繼續,跌出了times循環。

這意味着您可以創建一個文件,將其管理到您的腳本中,Ruby將做正確的事情。我可以重寫測試。RB代碼:

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 

由於反引號很多之一方法來稱呼她或者運行代碼,您可以調整調用代碼和/或孩子,以讀取文件。或者讓Ruby讀取輸入並生成要調用的文件。或者使用Expect進行調查,但我不會希望對任何人。

這應該有助於你走上正確的道路。

+0

感謝您的回覆。我嘗試了上面的例子,它們按預期工作,所以我跳回到我原來的任務,** temp.rb **的內容:'puts%x [sh ./test.sh