Отвечая на приглашение в рубине с open3?

Извиняюсь за отсутствие примера кода, я сейчас на мобильном.

Я получил ruby ​​+open3 для запуска команд и сохранения stdout и stderr в переменную.

Мой вопрос: если интерфейс командной строки запрашивает пользователя, можно ли ввести текст в приглашение и нажать клавишу ввода? Если так, то как бы я поступил так?

Пример объяснения Запускает программу, программа в терминале и спрашивает "как тебя зовут?" и ждет ввода.

Я хочу ввести имя, нажмите Enter.

Затем он задает следующий вопрос, я хочу поставить на стандартный ввод и ответить на него, а также

Это для теста автоматизации. Если у кого-то есть идея получше, чем у open3, у меня все уши, но я ограничен рубином

Спасибо

1 ответ

Учти это:

Создайте входной файл, используя:

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 вызвал вложенную оболочку, эта вложенная оболочка унаследует потоки 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
Другие вопросы по тегам