сброс пользователя в IRB после чтения из канала - PullRequest
1 голос
/ 03 января 2011

У меня есть этот скрипт, который переводит пользователя в сеанс IRB при выполнении.

Все хорошо, но когда я использую * nix pipe для получения ввода (например, с cat), сеанс IRB заканчивается немедленно.

Я мог бы уменьшить скрипт (назовем его myscript.rb) до следующего:

require 'irb'

if $stdin.stat.size > 0
  @text = $stdin.read 
else
  @text= "nothing"
end

ARGV.clear
IRB.start

Когда выполняется как: ruby myscript.rb, я оказываюсь в сеансе IRB (как и ожидалось).

Но (при условии, что foo.txt существует в cwd): cat foo.txt | ruby myscript.rb просто напечатает приглашение IRB, а затем сеанс IRB будет закрыт (меня сбрасывают до $ bash).

Какие-нибудь известные обходные пути или идеи?

Кстати: он имеет такое же поведение на ruby ​​1.8.7, как и на 1.9.2.

Ответы [ 3 ]

3 голосов
/ 03 января 2011

Я думаю, что ваша проблема в том, что при передаче по каналу сценария STDIN будет потоком из вашего файла, поэтому, когда вы запускаете IRB, он будет читать из того же потока, но обратите внимание, что он заканчивается, и завершается, просто как при вводе ctrl-D (это ручное завершение сигнала файла).

Вы можете снова открыть STDIN для чтения с tty (то есть с клавиатуры) следующим образом:

STDIN.reopen(File.open('/dev/tty', 'r'))

но это выглядит немного странно для меня, я не получаю должного IRB. IRB работает, хотя.

2 голосов
/ 03 января 2011

@ Тео идентифицировал проблему.

Также, требование irb перед IRB.start исправит отсутствующие настройки IRB.В итоге код выглядит так:

if $stdin.stat.size > 0
  @text = $stdin.read
  $stdin.reopen(File.open("/dev/tty", "r"))
else
  @text= "nothing"
end

require 'irb'
ARGV.clear
IRB.start
0 голосов
/ 03 января 2011

$ stdin.read читает ваш ввод, прежде чем IRB сможет его прочитать (если вы пытаетесь заставить IRB выполнять команды из stdin).

...