用open3回答ruby中的cli提示符?

对于缺少示例代码表示抱歉,我现在正在使用移动设备。

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

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

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

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

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

这是一个自动化测试。 如果有人比open3有更好的想法,我会全都耳朵,但我只限于ruby

谢谢

考虑一下:

使用以下命令创建输入文件

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将inheritanceRuby的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