我有一个简单的脚本来处理来自 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 命令提示符。

最佳答案

问题是 Pry 使用 Readline ,它反过来从标准输入读取。如果您使用 ruby​​ 作为过滤器,则 stdin 不再是终端(isatty 将为 false)。因此 Readline 将无法使用 stdin 并默默前进(或者,如果幸运的话,会出现语法错误并继续前进)。

您可以通过添加为 Readline 提供工作 tty

require "readline"
Readline.input = IO.new(IO.sysopen("/dev/tty", "r+"))

到您的代码。

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

关于ruby - 如何使用 Pry 测试类似过滤器的 Ruby 脚本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24623290/

10-12 07:21