首页 > 解决方案 > 我可以在我的 Vagrantfile 运行的 Ruby 脚本中运行 GETS

问题描述

我是 Vagrant 和 Ruby 的新手。

是否可以将用户键盘输入到我从 Vagrantfile 触发的 ruby​​ 脚本中,因此:

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 中,而不是在被调用的脚本中。

标签: rubyvagrantgets

解决方案


推荐阅读