Отвечая на приглашение в рубине с 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