我有这个脚本在执行时将用户丢弃到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上具有相同的行为。
答案 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执行命令)。