Я новичок в Вагранте и Руби.
Можно ли получить ввод с клавиатуры пользователя в скрипт 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.
Погуглив, я обнаружил, что у других была такая же проблема с Ruby и Bash, но решения не было.
Возможно ли использование get в скрипте ruby, вызываемом из моего Vagrantfile?
У меня есть обходной путь, который заключается в размещении STDIN.gets в Vagrantfile, а не в вызываемом скрипте.