使用open3在ruby中回答cli提示符?

时间:2015-04-29 20:23:44

标签: ruby automation

对于缺少示例代码感到抱歉,我现在正在移动设备上。

我已经获得了ruby + open3来运行命令并将stdout和stderr保存到变量中。

我的问题是,如果命令行界面提示用户是否可以在提示符中输入文本并按Enter键?如果是这样,我将如何做到这一点。

示例说明 运行程序,终端程序然后询问"你的名字是什么?"并等待输入。

我想输入一个名字,按回车键。

然后它问下一个问题,我想把它放到stdin并回答那个问题

这是一个自动化测试。如果有人比open3有更好的想法,那么我只能听到红宝石

谢谢

1 个答案:

答案 0 :(得分:0)

考虑一下:

使用以下方法创建输入文件:

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将做正确的事情。如果Ruby调用了子shell,则子shell将继承Ruby的STDIN,STDOUT和STDERR流。我可以将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