如何使用Pry测试类似过滤器的Ruby脚本?

时间:2014-07-08 03:37:58

标签: ruby bash pipe stdin pry

我有一个简单的脚本来处理来自STDIN的行。有时出现异常 - 一些UTF-8转换错误 - 我想检查变量,导致错误的原因。我在我的文件中使用以下语法(让我们调用filter.rb),但我从来没有得到过Pry提示符:

#!/usr/bin/ruby
require "pry"

n=0
while line=STDIN.gets do
 begin
   n=n+1
   raise "an exception" if n==2
 rescue => e
   binding.pry
 end
end

当我发出:

cat data.txt|ruby filter.rb

我在屏幕上看到:

     5:   while line= STDIN.gets do
     6:    begin
     7:      n=n+1
     8:      raise "an exception" if n==2
     9:    rescue => e
 => 10:      binding.pry
    11:    end
    12:   end

但事实上,我得到的只是一个bash提示符,而不是Pry命令提示符。

2 个答案:

答案 0 :(得分:4)

问题是Pry使用Readline,而{{3}}又从stdin读取。如果使用ruby作为过滤器,则stdin不再是终端(isatty将为false)。因此,Readline无法使用标准输入并默默地进行(或者语法错误并继续前进,如果你很幸运的话)。

您可以通过添加

为Readline提供工作tty
require "readline"
Readline.input = IO.new(IO.sysopen("/dev/tty", "r+"))

代码。

Pry文档暗示了这个解决方案,但是我不知道这是否是由Pry批准的,或者它是否会导致与Pry,Ruby的其他部分以及您在应用程序中可能具有的任何其他移动位的奇怪交互。 .YMMV。

答案 1 :(得分:0)

我认为BertD的答案会很好。

最简单的要做的就是正常读取文件,(粗略地),例如,

File.new("data.txt").each_line do |line|
  begin
    n += 1
    raise "an exception" if n == 2
  rescue => e
    binding.pry
  end
end

我还鼓励将处理封装在类/方法中,以便 数据如何输入到数据的发生的单独问题。它还使得单独调试事情变得更加容易。