从管道读取后将用户丢弃到IRB

时间:2011-01-03 14:36:26

标签: ruby irb

我有这个脚本在执行时将用户丢弃到IRB会话。

一切都很好,但是当我使用* nix管道获取输入时(例如使用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)。

任何已知的解决方法或想法?

BTW:它在ruby 1.8.7以及1.9.2上具有相同的行为。

3 个答案:

答案 0 :(得分:3)

我认为你的问题是,当你管道到你的脚本时,STDIN将是来自你文件的流,所以当你启动IRB时它将从同一个流中读取,但是注意它已经结束了,然后退出,只是就像你输入ctrl-D(这是一个手动的文件结束信号)一样。

你可以重新打开STDIN来读取tty(即键盘),如下所示:

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

但对我来说这看起来有点奇怪,我没有得到正确的IRB承诺。 IRB虽然有效。

答案 1 :(得分:2)

@Theo发现了问题。

此外,在IRB.start之前需要irb将修复缺少的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

答案 2 :(得分:0)

$ stdin.read在IRB有机会读取之前读取您的输入(如果您试图强制IRB从stdin执行命令)。