通过 ruby 运行 cmd 命令



我正在编写一个程序,该程序执行另一个用c编写的程序,这是我的第一次尝试

require 'Open3'
system 'tcc temp.c'
Open3.popen3('temp.exe') do |stdin, stdout, stderr|
   stdin.puts '21n'
   STDOUT.puts stdout.gets
end

实际输出:

Enter the temperature in degrees fahrenheit: The converted temperature is -6.11

期望的输出:

Enter the temperature in degrees fahrenheit: 21
The converted temperature is -6.11

如果你知道更好的方法,请告诉我,我是Ruby的新手。

您似乎至少有两个潜在问题:

  1. 换行符不会在单引号内展开。要在字符串中包含换行符,您需要使用双引号,例如 "21n"
  2. 在某些情况下,您实际上需要回车符而不是换行符。当尝试使用终端执行类似 Expect(类似 Expect)的事情时尤其如此。例如,您可能会发现字符串中需要r而不是n

您肯定需要修复第一件事,但您可能还需要尝试第二件事。这绝对是"您的里程可能会有所不同"的情况之一。

似乎您希望21出现在屏幕上,因为当您运行temp.exe并键入21时,它会出现。在这种情况下,它出现在屏幕上的原因是您将它们键入到shell中,这会"回显"您键入的所有内容。

但是,当您通过 Ruby 运行程序时,没有 shell 和键入,因此即使它被正确发送到程序的标准输入,21也不会出现在屏幕上。

最简单的解决方案非常简单。只需将其写入 Ruby 的标准输出:

require 'Open3'
system 'tcc temp.c'
Open3.popen3('temp.exe') do |stdin, stdout, stderr|
  STDOUT.puts "21"
  stdin.puts '"21"
  STDOUT.puts stdout.gets
end

(你会注意到我拿出了n - IO#puts为你补充了它。

不过,这有点重复。您可以定义一个简单的方法来为您处理它:

def echo(io, *args)
  puts *args
  io.puts *args
end

然后:

Open3.popen3('temp.exe') do |stdin, stdout, stderr|
  echo(stdin, "21")
  puts stdout.gets
end

相关内容

  • 没有找到相关文章

最新更新