Проблема с использованием open4 в Ruby - PullRequest
1 голос
/ 15 сентября 2010

У меня есть скрипт, который я хочу выполнить с open4.

Вот файл:

Сценарий

#!/usr/bin/env ruby
print "Enter your username: "
username = gets
puts "Here is your username: #{username}"
print "Enter your password: "
password = gets
puts "Here is your password: #{password}"

Затем я запускаю IRB и набираю:

ruby-1.9.2-p0 > pid, stdin, stdout, stderr = Open4::popen4("./script")
=> [2649, #<IO:fd 9>, #<IO:fd 11>, #<IO:fd 13>]

ruby-1.9.2-p0 > puts stdout.gets

В последней строке я подумал, что это должно дать мне «Введите имя пользователя:», но это не так. Экран пуст независимо от того, что я печатаю. Я могу прекратить его только с помощью CTRL + C.

Тогда я бегу ...

ruby-1.9.2-p0 > puts stdout.gets

... снова, и на этот раз мне выдается «Введите ваше имя пользователя:».

Кто-то знает почему?

1 Ответ

0 голосов
/ 30 марта 2011

Это потому, что stdout.gets хочет прочитать всю строку, включая \n, но скрипт пока не печатал новую строку.

Итак, вам нужно заменить printputs.

Другое дело, что выходные данные ребенка буферизируются.Вам нужно установить $stdout.sync = true в начале или вызывать $stdout.flush после каждого puts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...