我是Vagrant和Ruby的新手。
是否有可能使用户键盘输入到我从Vagrantfile触发的红宝石脚本中:
config.trigger.after [:provision] do |trigger|
trigger.run = {inline: "C:/HashiCorp/Vagrant/embedded/mingw64/bin/ruby app/scripts/test.rb"}
end
我的主机是Windows 10,我的访客是Bento \ ubuntu-18.10。
我已经成功创建了在Virtualbox中运行的计算机。
我尽可能简化了test.rb。
此代码:
#!/usr/bin/ruby
puts "enter selection"
puts "xrestore"
按我的预期返回此值:
c:\Users\neile\Documents\development\vagrant\bento\ubuntu-18.10-mysql>vagrant provision
==> vm1: [vagrant-hostsupdater] Checking for host entries
==> vm1: Running action triggers after provision ...
==> vm1: Running trigger...
vm1: Running local: Inline script
vm1: C:/HashiCorp/Vagrant/embedded/mingw64/bin/ruby app/scripts/restore-db.rb
vm1: enter selection
vm1: xrestore
c:\Users\neile\Documents\development\vagrant\bento\ubuntu-18.10-mysql>
此代码:
#!/usr/bin/ruby
puts "enter selection"
STDOUT.flush()
xrestore = STDIN.gets.chomp
puts "xrestore"
返回此:
>vagrant provision
==> vm1: [vagrant-hostsupdater] Checking for host entries
==> vm1: Running action triggers after provision ...
==> vm1: Running trigger...
vm1: Running local: Inline script
vm1: C:/HashiCorp/Vagrant/embedded/mingw64/bin/ruby app/scripts/restore-db.rb
vm1: enter selection
没有提示输入变量值:xrestore
并且处理似乎停止了。
要终止该过程,请输入Ctrl-C两次。
如果我忽略了:STDOUT.flush()
我什至没有得到提示“输入选择”
我尝试将路径ruby.exe放在系统环境变量PATH中,并从trigger.run语句中删除该路径。
这将产生与上述相同的结果。
(顺便说一句,我尝试使用bash脚本执行此操作,并且bash read语句也存在类似问题。
谷歌搜索,我发现其他人在Ruby和Bash上也有相同的问题,但没有解决方案。)
是否甚至可以在Vagrantfile调用的ruby脚本中使用“ gets”?
我确实有一种解决方法,即将STDIN.gets放在Vagrantfile中,而不是在被调用的脚本中。