2

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

一切都很好,但是当我使用 *nix 管道获取输入(例如使用cat)时,IRB 会话立即结束。

我可以将脚本(我们称之为 myscript.rb)简化为以下内容:

需要'irb'

如果 $stdin.stat.size > 0
  @text = $stdin.read
别的
  @text="什么都没有"
结尾

ARGV.清除
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 上具有相同的行为。

4

3 回答 3

3

我认为您的问题是,当您通过管道传输到脚本时,STDIN 将是文件中的流,因此当您启动 IRB 时,它将从同一流中读取,但请注意它已结束并退出,就像它会当您键入 ctrl-D (这是手动文件结束信号)时。

您可以像这样重新打开 STDIN 以从 tty(即键盘)读取:

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

但这对我来说有点奇怪,我没有得到正确的 IRB 提示。IRB 虽然有效。

于 2011-01-03T14:46:26.977 回答
2

@Theo 发现了问题。

此外,要求 irb beforeIRB.start将修复缺少的 IRB 设置。最后,代码如下所示:

如果 $stdin.stat.size > 0
  @text = $stdin.read
  $stdin.reopen(File.open("/dev/tty", "r"))
别的
  @text="什么都没有"
结尾

需要'irb'
ARGV.清除
IRB.start
于 2011-01-03T15:26:11.777 回答
0

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

于 2011-01-03T14:53:07.457 回答