对于缺少示例代码感到抱歉,我现在正在移动设备上。
我已经获得了ruby + open3来运行命令并将stdout和stderr保存到变量中。
我的问题是,如果命令行界面提示用户是否可以在提示符中输入文本并按Enter键?如果是这样,我将如何做到这一点。
示例说明 运行程序,终端程序然后询问"你的名字是什么?"并等待输入。
我想输入一个名字,按回车键。
然后它问下一个问题,我想把它放到stdin并回答那个问题
这是一个自动化测试。如果有人比open3有更好的想法,那么我只能听到红宝石
谢谢
答案 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(默认情况下)查找行尾,在这种情况下是尾随bar
和baz
的字符。如果我在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