ruby - 我可以在我的 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 中,而不是在被调用的脚本中。
解决方案
推荐阅读
- c# - Jsonconvert serializeobject 不转义单引号
- python - 带有 if 循环的套接字不会给出一致的结果
- python - 使用 PySpark Streaming 反序列化 Kafka json 消息
- .net - C#折叠用双引号括起来的字符串数组
- javascript - 带有 forEach 功能的 querySelectorAll 不适用于轮播幻灯片上的切换按钮
- c++ - 如何检查 std::unique_ptr 中的元素
? - scala - 如何找出哪一行在scala repl中引发了异常?
- reactjs - 多个 React Apollo 查询的一个加载屏幕
- php - 带有变量和数组的php函数
- javascript - 如何从网页返回所有 HTML?