【问题标题】:Simulating command prompt commands模拟命令提示符命令
【发布时间】:2016-06-21 13:20:23
【问题描述】:

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

问题是,我没有取回我输入的内容。

有没有办法可以纠正它,或者可能有更好的方法来做到这一点?

【问题讨论】:

    标签: ruby command popen3


    【解决方案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 会做正确的事情。我可以将 test.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
    

    由于反引号是调用子 shell 或运行代码的多种方式之一,因此您可以调整调用代码和/或子 shell 以读取文件。或者让 Ruby 读取输入并生成要调用的文件。或者使用 Expect 进行调查,但我不希望任何人这样做。

    这应该可以帮助您走上正确的道路。

    【讨论】:

    • 感谢您的回复。我尝试了上面的示例,它们按预期工作,所以我跳回到我原来的任务,temp.rb 的内容:puts %x[sh ./test.sh &lt; test.input] test.sh 的内容:@987654339 @ 并且在 test.input 中我只输入了 56 并且答案仍然相同,它没有打印输入。输出为:以华氏度为单位输入温度:转换后的温度为 13.333333
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2017-04-22
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多